Algorithm 等分子集和
立法会: 因此,允许计算dp[i][j]的公式,其中,如果第一个i元素的组合等于j,则为: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] = 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]“风格”只是为了说明他们是如何构建矩阵的?谢谢!!