代码随想录训练营第42天|416.分割等和子集
416.分割等和子集
文章
思路
看作容量为总和一半的背包问题,某方案恰好能装满时返回TRUE
二刷,还是不能一遍过
新学了一维数组的写法
代码
class Solution {
public boolean canPartition(int[] nums) {
int capacity = 0;
int i, j, n;
n = nums.length;
for (i = 0; i < n; ++i) {
capacity += nums[i];
}
if (capacity % 2 == 1) {
return false;
}
capacity /= 2;
int[] dp = new int[capacity + 1];
for (j = 0; j < capacity + 1; ++j) {
dp[j] = nums[0] <= j ? nums[0] : 0;
//System.out.print(" " + dp[j]);
}
//System.out.println();
for (i = 1; i < n; ++i) {
for (j = capacity; j > 0; --j) {
dp[j] = j >= nums[i] ? Math.max(dp[j - nums[i]] + nums[i], dp[j]) : dp[j];
//System.out.print(" " + dp[j]);
if (dp[j] == capacity) {
return true;
}
}
//System.out.println();
}
return false;
}
}
总结
一维数组要倒序遍历,防止修改过前面的值对后面造成影响