1、0-1背包问题
- 现在有一个小偷,要从商店偷走一些物品。这些物品只能选择带走,或者不带走(要么0,要么1)。物品一共有n件,第i件商品的重量是Wi,价值是Vi。小偷的背包只能带走Wj斤的物品。求应该带走哪几样物品,使得价值最高。
2、部分背包问题
- 背景和上述一致,但是这次小偷可以带走物品的一部分,而不是必须带走1个完整的物品。可以理解为:
- 0-1背包问题中:物品是金锭、银锭、铜锭。
- 部分背包问题中:物品是金沙、银沙、铜沙。
3、解决方案
- 贪心算法可以求解【部分背包问题】,但是不能解决【0-1背包问题】。贪心算法核心就在于贪心策略的选择。现在假设有下列贪心策略:
- 选择单位重量价值最高的。
- 背包承重50kg,有3个物品:10kg-60块、20kg-100块、30kg-120块。我们选择单位重量价值最高的:那么先拿走10kg-60块,背包还剩下40kg。此时单位重量价值最高的是20kg-100块。装进去以后,背包里有30kg,总价值为160块。此时只剩下20kg的容量,装不下30kg-120块了。很明显,这种选择不如拿走(20kg-100块)和(30kg-120块),可以把背包装满,总价值是220块。
- 选择价值最高的。
- 很容易举出反例:10kg-20块,20kg-30块,50kg-35块。
- 选择重量最高的。
- 反例:10kg-20块,20kg-30块,50kg-35块。
- 选择单位重量价值最高的。
贪心算法没法从全局去规划,求出全局最优解。它只能求出子问题的最优解,把子问题的最优解合并以后,未必是全局的最优解。
贪心算法在子问题得出最优解以后,哪怕之后还有更优解,但是已经无法剔除之前作出的选择。(导致无法得到全局最优解)
- 在0-1背包问题上,无法得出最优解的主要原因是:贪心策略的规则下,无法保证背包一定能被装满。部分空闲的背包容量,导致已经装进去的物品的平均价值降低了。(上述例子中,剩余的20kg,无法装下最后的那个30kg的物品)