我正在阅读有关 0-1 背包问题的维基百科。我只是想澄清几件事。我有两个问题: http ://en.wikipedia.org/wiki/Knapsack_problem#0.2F1_Knapsack_Problem
我遇到了这个伪代码:
// Input:
// Values (stored in array v)
// Weights (stored in array w)
// Number of distinct items (n)
// Knapsack capacity (W)
for w from 0 to W do
m[0, w] := 0
end for
for i from 1 to n do
for j from 0 to W do
if j >= w[i] then
m[i, j] := max(m[i-1, j], m[i-1, j-w[i]] + v[i])
else
m[i, j] := m[i-1, j]
end if
end for
end for
专门针对这部分:
if j >= w[i] then
m[i, j] := max(m[i-1, j], m[i-1, j-w[i]] + v[i])
1)如果我错了,请纠正我,但不应该是:
m[i, j] := max(m[i-1, j], m[i-1, j-w[i]] + v[i], m[i,j-w[i]] + v[i])
?
或者如果没有,有人可以解释我为什么不需要它吗?
...
2)我还有另一个问题,如果说我想优化一下。让“for j from 0 to W”循环增加所有项目权重的 GCD(即存储在数组 w 中的值的 GCD)是否明智。(当我即将实现它时,我现在只是在考虑代码方面的问题)。