public int findTargetSumWays(int[] nums, int target) {
int sum = 0;
for(int num: nums) sum += num;
if(target < -sum || target > sum) return 0;
int n = nums.length;
int[][] dp = new int[n + 1][2 * sum + 1];
int offset = sum;
dp[0][0 + offset] = 1;
for(int i = 0; i < n; i ++){
for(int s = -sum; s <= sum; s ++){
if(-sum <= s + nums[i] && s + nums[i] <= sum)
dp[i + 1][s + offset] += dp[i][s + nums[i] + offset];
if(-sum <= s - nums[i] && s - nums[i] <= sum)
dp[i + 1][s + offset] += dp[i][s - nums[i] + offset];
}
}
return dp[n][target + offset];
}
bobo老师,上面是你的解法,我看懂了dp方程是这么列出来的
dp[i][j] = dp[i-1][j - nums[i]] + dp[i - 1][j + nums[i]];
可是有个地方我不理解:dp的行 为什么需要是n+1?
我本来尝试这么定义,dp[i][j]表示前面nums[0,i]个元素,组成背包容量是j的方法数,那么求的就是dp[nums.length - 1][target]
最后发现结果是错的,然后打印二者的差别,发现我这样写的话实际上会少算一行,必须dp的行是n+1,且遍历的时候,外层for循环必须要遍历到nums.length结束。我想不明白是什么原因,感觉自己对dp的定义都不是很清楚,能请帮忙解释下吗