Algorithm 等分子集和

Algorithm 等分子集和,algorithm,dynamic-programming,Algorithm,Dynamic Programming,立法会: 因此,允许计算dp[i][j]的公式,其中,如果第一个i元素的组合等于j,则为: dp[i][j] = dp[i - 1][j - nums[i - 1]] || dp[i - 1][j]; OR运算符前面的前半部分表示选择第I个元素时发生的情况 我的问题是为什么它是j-nums[i-1]而不是j-nums[i] 难道我们不应该用元素i的当前“权重”(nums[i])减去当前的和(j),然后看看第一个i-1元素是否可以加起来 为什么我们要减去上一个元素的值?注意,表中包含n+1行,我

立法会:

因此,允许计算dp[i][j]的公式,其中,如果第一个i元素的组合等于j,则为:

dp[i][j] = dp[i - 1][j - nums[i - 1]] || dp[i - 1][j];
OR运算符前面的前半部分表示选择第I个元素时发生的情况

我的问题是为什么它是
j-nums[i-1]
而不是
j-nums[i]

难道我们不应该用元素i的当前“权重”(nums[i])减去当前的和(j),然后看看第一个i-1元素是否可以加起来


为什么我们要减去上一个元素的值?

注意,表中包含
n+1
行,我们可以在更完整的代码中看到
i
索引从
1
n
,因此
nums[i-1]
指的是索引
0..n-1
范围内
nums[]的零基项

   for (int i = 1; i < n+1; i++) {
        for (int j = 1; j < sum+1; j++) {
            dp[i][j] = dp[i-1][j];
            if (j >= nums[i-1]) {
                dp[i][j] = (dp[i][j] || dp[i-1][j-nums[i-1]]);
            }
        }
    }
for(int i=1;i=nums[i-1]){
dp[i][j]=(dp[i][j]| | dp[i-1][j-nums[i-1]);
}
}
}

我认为你对
j-nums[I]
的看法是正确的(虽然我不知道引文在哪里):注意,代码前的文本描述是正确的
因此,转换函数是dp[I][j]=dp[I-1][j]| dp[I-1][j-nums[I]
非常奇怪,因为“错误代码”的解决方案会传递给LC……好的,我看到了不一致的根源。答案是addedOk,所以答案都是有效的,而j-nums[i-1]“风格”只是为了说明他们是如何构建矩阵的?谢谢!!