基本思想
与动规类似,把大问题分解,把因为求第i个物品放入背包的获利会受到第i-1个物品的影响,因此,需要考虑其影响,即考虑第i-1个物品获利。然后在剩余空间允许的情况下,再考虑将第i个物品放入后的获利并与前比较,这样,就获得了状态转移方程:
F[i,v] = max{F[i − 1,v],F[i − 1,v − Ci] + Wi}。
这样的常规思路需要一个DP二维数组来记录(以体积为标准),记录第i个物品获得的最大值,知道所有物品放完,最后便可以产生最大价值。
空间复杂度的优化
以上方法的好处是以空间换时间,但是空间复杂度是可以优化的,因为每次第i个物品会与第i-1个有关系,这种可以只考虑上一个的情况,用一维数组便可以解决,因此用一个F[v],便可以代替F[i- 1,v]和F[i-1,v-Ci],不过,需要注意的是,在递推的时候,需要V的递减顺序(如果是递增,计算过程中会出现一维数组出现前半段是f[v],后半段是f[v-1]的情况,而计算后边的时候需要调用前面的,会让计算f[v]调用前半段的f[v]而非f[v-1]导致错误。)
F[v] ← max{F[v],F[v − Ci] + Wi}