【算法】背包——误认为贪心的陷阱

有n件物品,第i件物品(I = 1,2,3…n)的价值是vi, 重量是wi,我们有一个能承重为m的背包,我们选择一些物品放入背包,每样只能放一个,显然放入背包的总重量不超过m。我们要求选择物品的总价值最大,请问如何选择?这里我们假设所有出现的数都是正整数。

背包问题如果没有认真理解的话,第一种思路应该会往贪心的方面思考。

比如先以物品贵重程度排序,先选比较贵重的。
然而对于数据:

n = 3, m = 3
v = (2,2,3)
w = (1,2,3)

按照先选贵重物品的策略,会先选择价值为3的那个,并且背包装满了,但是如果我们选取前两个物品,总价值可以达到4。

如果按照性价比排序:
对于数据

n = 3, m = 7
v = (2,3,4)
w = (3,4,5)

按这种方法因为2/3 < 3/4 < 4 / 5,我们先选择第三件物品,但是选了它之后别的东西放不下了!总价值是4,但如果我们选择前两件物品可以拿到总价值5。

造成这种现象的原因是贪心的原则为:通过每一步的最优解推导出整体的最优解,然而对于背包问题,因为每一步取或者不取的最优解取决于整体,也就是“动态”的。所以,背包问题成为了一个经典的动态规划问题。

再看一道部分背包问题

一个旅行者有一个最多能装m公斤的背包,然后又n重物品,它们的重量和价值分别为w[i],c[i],问旅行者能获得的最大价值

这一题便是贪心问题,因为我们可以一直选性价比高的直到填满,所以是否贪心取决于每种物品是否只取走一部分。

而背包问题又衍生出了很多变形,动态规划的方法也不尽相同,所以需要多加练习才能掌握这一题型。

参考文章:
51NOD
百度知道
百度文库

posted @ 2016-08-09 18:14  BoilTask  阅读(18)  评论(0编辑  收藏  举报