为什么01背包要倒着推,完全背包要顺着推

为什么01背包要倒着推,完全背包要顺着推

我忽然发现,这个小学的知识点,额,一直没有弄懂。现在赶快总结一下。

01背包每个物品只能选一次,所以若用\(f[i][v]\)表示前i件物品,恰好放入一个容量为v的背包可获得的最大价值,那么其二维状态转移方程是:\(f[i][v]=max(f[i-1][v], f[i-1][v-c[i]]+w[i])\)。注意是恰好,所以最后还要max一下。也可以不max,那么定义要把恰好去掉,并且\(f[i][v]\)的初始值应当包括\(f[i][v-1]\)

显然01背包可以在空间上优化。采用滚动数组的思想,\(fnow[v]=max(fpre[v], fpre[v-c[i]]+w[i])\)。然而我们平时并不是这样写的,我们把fpre也优化掉了。通过倒推,我们可以让能够推出\(f[v]\)的状态比\(f[v]\)后更新,于是状态转移方程是\(f[v]=max(f[v], f[v-c[i]]+w[i])\)

完全背包的二维转移方程是这样的:\(f[i][v]=max(f[i-1][v], f[i][v-c[i]]+w[i])\)。也就是说自己可以用到自己那一层的状态。所以如果想把第一位优化掉,可以直接顺推。而优化空间后的方程除了推的方向,和01背包是一模一样的。

所以说,01背包和完全背包,之所以推的方向不同,是由于原来的二维方程不同。一维方程正好只是巧合而已。

posted @ 2017-11-04 10:45  pechpo  阅读(1195)  评论(1编辑  收藏  举报