LeetCode494目标和
原题
01背包
把数组遍历求和,减去目标S后所剩值即为 标为“-”的数的和的两倍
故如果(sum-S)%2后为奇数 则方案数为零
然后就按普通01背包的套路 在nums数组中遍历 看那些数字之和能与之相等
class Solution {
public int findTargetSumWays(int[] nums, int S) {
int len = nums.length;
int sum = 0;
for(int i=0;i<len;i++){
sum += nums[i];
}
if(sum<S){
return 0;
}
if((sum-S)%2==1){
return 0;
}
int minus = (sum-S)/2;
int[] dp = new int[minus+1];
dp[0] = 1;
for(int i=0;i<len;i++){
//需要注意如果优化成滚动数组,第二层循环需要逆序遍历,因为正序的话,在计算新dp[j]时,dp[j-nums[i]]就已经是更新过的值了
//如果没优化,则顺序无所谓
for(int j=minus;j>=nums[i];j--){
dp[j] = dp[j] + dp[j-nums[i]];
}
}
return dp[minus];
}
}

浙公网安备 33010602011771号