为什么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背包和完全背包,之所以推的方向不同,是由于原来的二维方程不同。一维方程正好只是巧合而已。