思路:
要等分和子集,数组的和必须是偶数,如果是奇数,一定不可能分割。
计算好数组的和后,每个数字有选或者不选两种选择,要凑成sum。
可以想到背包问题。
总结:
背包问题,从一些列数字中选取几个,使得和最接近sum。
代码:
class Solution {
public boolean canPartition(int[] nums) {
int n = nums.length;
int sum = 0;
for(int i = 0; i < n; i++) {
sum += nums[i];
}
if(sum % 2 == 1) 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;
}
}