0/1背包和动态编程

时间:2014-01-31 21:21:27

标签: algorithm data-structures

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

感谢。

1 个答案:

答案 0 :(得分:3)

你是对的。 m[i,j]的值仅取决于较小的is和js的值。改变垂直顺序的情况是其中一个元素可以增加的情况。例如,如果m[2,2]取决于m[1,3],那么我们需要在移动到第二行之前共同计算第一行。