本文主要是介绍背包九讲笔记-01背包问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
基本思想
与动规类似,把大问题分解,把因为求第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}
这篇关于背包九讲笔记-01背包问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!