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];
    }

}
posted @ 2021-03-12 14:58  economies  阅读(33)  评论(0)    收藏  举报