背包问题是典型的动态规划的一个问题,为了简单的理解,那么让我来简单的解释一下吧:
先来描述这个问题,假如你有一个包包能装下VOLUMN个单位重量的东西,那么现在有N种东西给你选,这N种东西都有N种价值,同时也有N种重量,那么如下来表示吧:
VOLUMN:总重量
weight[i]:第i种物品的重量
value[i]:第i种物品的价值
使用函数f[i][j]来表示装第i件物品,假设总重为j时的总价值,可以构建状态转移函数:
f[i][j] = max(f[i-1][j],f[i-1][j-weight[i]]+value[i])
其实当你列出动态表就好理解了:
就相当于这一次i在这个j总重量的时候你的选择,你有两种,一种是不选择它,即f[i][j] = f[i-1][j],一种是选择它,失去weight[i]的重量空间而获得value[i]的价值,这是贪婪的做法。在表里面就相当于找到上一行的减去weight[i]个单元的价值加上value[i]这样不断的构建,当i达到N时,j达到VOLUMN时便得到了最佳解。
伪代码如下:
i from 1 -> N:
j from 0->VOLUMN:
if(weight[i] <= j)://当东东重量小于包包剩余重量时才能塞进去
f[i][j] = max(f[i-1][j],f[i-1][j-weight[i]]+value[i])
else:
f[i][j] = f[i-1][j]
结束