在http://en.wikipedia.org/wiki/Knapsack_problem中,DP为:
// Input:
// Values (stored in array v)
// Weights (stored in array w)
// Number of distinct items (n)
// Knapsack capacity (W)
for j from 0 to W do
m[0, j] := 0
end for
for i from 1 to n do
for j from 0 to W do
if w[i] <= j 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
我认为切换权重循环和数字循环的顺序不会影响最优解。这是正确的吗?说
for j from 0 to W do
for i from 1 to n do
感谢。
答案 0 :(得分:3)
你是对的。 m[i,j]
的值仅取决于较小的is和js的值。改变垂直顺序的情况是其中一个元素可以增加的情况。例如,如果m[2,2]
取决于m[1,3]
,那么我们需要在移动到第二行之前共同计算第一行。