引入
假如你像鲁滨逊一样流落在荒岛上,不同的是荒岛遍布黄金,你的女朋友得知你流落荒岛的消息立刻来找你,在你离开之前要尽可能的多带走黄金为了以后和女朋友幸福的生活...你的背包大小是有限的,因此你要取装尽可能价值大的黄金,而不是混有许多杂质的黄金,请问你要如何分配这背包呢?
以上就是典型的01背包模型,在有限的背包容量中尽可能存放最大的价值。
01背包
思路
如何实现有限背包的价值最大化呢?我们可能有一些基本的猜想:
- 先拿大的,等大的装不下了再装小的,直到把背包装满
- 先看看那些价值高但是体积不是很大的,也就是所谓的性价比,装性价比最大的直到背包装不下为止
其实两种想法都有一定的道理,但是又各有各的漏洞:
第一种你无法确定体积大价值一定大,所以你可能错过真正有价值的反而去存放一些价值低的。
第二种似乎已经是正确答案了,但是在最后你无法背包容量是否能装其他的性价比虽小但是背包还可以放得下的,虽然性价比小,但是有总比没有好。
其实我们可以一步步来分析保证每一步都是拿到最优的结果,再让分析后面时直接使用前面已经取到的最优的结果。如果这句话你看不懂也没关系,我来通俗的解释一下:假如背包的容量为n,那我们是否可以利用一个这样的结果:在背包容量为 n - 1 的时候背包存储的最大价值 ,这给结果再加上 体积为 1 的价值最大的物品的价值。不就是背包容量为 n 的时候能取到的最大价值吗?现在再去看第一句话,是不是就可以理解了。
因此为了实现价值最大化,我们遍历到的每一个物品时,都要判断这个物品要不要放进背包,放进背包后,背包的剩余容量要减去相应的物品体积。
用公式来说明那就是:令 来表示前 i 个物品,在背包容量为 j 时能存放的最大价值
那么我们假设一共有 n 个物品,m 体积的背包,每个物品都有两个属性:体积 v 和价值 w。
则
。二者分别是判断选不选第 i 个物品,如果不选那结果和第 i -