youngyangyang04/leetcode-master-comment

[Vssue]0494.目标和.md

youngyangyang04 opened this issue · 6 comments

int sum = 0;
for (int num : nums) sum += num;
if (Math.abs(target) > sum) return 0;
if ((target + sum) % 2 == 1) return 0;

int w = (sum + target) / 2;
int[] dp = new int[w + 1];
dp[0] = 1;
for (int i = 0; i < nums.length; i++) {
    for (int j = w; j - nums[i] >= 0; j--) {
        dp[j] += dp[j - nums[i]];
    }
}
return dp[w];

初始化那里我觉得说的不好,我看的云里雾里的,根据我的理解,DP[0]初始化时候,实际上初始化的是-1层,即初始化的DP[-1][j]这一层,可以理解为什么都不放时,满足DP[j]的个数,因为什么都没有,只有DP[-1][0]=1,其他都是不可实现的,然后根据滚动数组,将i隐藏了,但初始化的值还是这些,所以DP[0]=1。

dp[j] += dp[j - nums[i]];
新的组合可以通过向已有的组合中添加新元素来构建。