
原题链接
- 要实现能分割成两个元素和相等的子集,可以归结为背包问题
- 只有所有元素的 和 为偶数的时候,才能操作,若不为偶数,则直接返回false
- 归结为背包问题:要分成两个元素和相等的子集,即要求每一个子集的和都要是sum / 2
- 即包的容量为 sum / 2,是否存在往包里加物品可以满足 刚好装满的问题,其实就是背包问题
class Solution {
public boolean canPartition(int[] nums) {
if(nums == null || nums.length == 0) return false;
int n = nums.length;
int sum = 0;
for(int num : nums){
sum += num;
}
if(sum % 2 != 0) return false;
int target = sum / 2;
int[] dp = new int[target + 1];
for(int i = 0; i < n; i++){
for(int j = target; j >= nums[i]; j--){
dp[j] = Math.max(dp[j], dp[j-nums[i]] + nums[i]);
}
}
return dp[target] == target;
}
}