LeetCode 62.不同路径
题目链接:https://leetcode.cn/problems/partition-equal-subset-sum/description/
文章链接:https://programmercarl.com/0416.%E5%88%86%E5%89%B2%E7%AD%89%E5%92%8C%E5%AD%90%E9%9B%86.html
思路
* 分割等和子集:那么 我们只需要找到数组中若干个数加起来是否等于sum/2;
* 那么我们可以将题目转换为从背包中取物品,能否装满容量为sum/2的背包,物品价值就是重量
* 那么dp[j]表示装满背包容量为j的背包的物品价值
public boolean canPartition(int[] nums) {
int sum = Arrays.stream(nums).sum();
// 若总和为奇数,一定不能平分
if (sum % 2 == 1)
return false;
int[] dp = new int[sum / 2 + 1];
dp[0] = 0;
for (int i = 0; i < nums.length; i++) {
for (int j = sum / 2; j >= nums[i]; j--) {
dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]);
}
}
return dp[sum / 2] == sum / 2;
}