Knapsack Problem分为两种情况:
1. 0-1 Knapsack Problem, 既0-1背包问题。
2. Fractional Knapsack Problem, 既部分背包问题。
下面将分析这两种问题以便加深对此的理解。
问题描述:一个人准备用一个最多能装W重量物品的包来装东西。东西总计有n个,其中第i个物品的重量是W[i],价值是V[i],问这个人最多能带价值多少的东西?
1. 0-1背包问题:在此类背包问题中,此人不能将物品分割为更小的部分。所以对于物品i,此人只能决定带走或者不带走(二元选择),而不能选择带走一部分。
2. 部分背包问题:在此类背包问题中,此人可以带走某物品的一部分,也就是说,物品可以被分割成更小的部分,而此人可以决定带走物品i的xi部分,0≤xi≤1。、
我们可以把0-1背包问题想象为一个人要带走一些贵金属块。而部分背包问题想象为一个人要带走一些贵金属沙。
对于0-1背包问题:
1.不存在贪婪选择性质(greedy choice property),因此不存在贪婪算法。
2.存在最优子结构(optimal substructure property)
3.存在相互重叠的子问题(overlapping subproblem)
所以0-1背包问题可以用动态规划的方法解决(Dynamic programming)。
对于部分背包问题:
1.存在贪婪选择性质
2.存在最优子结构
因此存在贪婪算法(Greedy algorrithm)
用v[1...n]和w[1...n]分别表示n件物品的价值和重量,W表示背包可以装的物品的总重量
I.首先看0-1背包问题
设S为背包可装重量为W时的最优解,i为这个最优解中的最大物品编号。那么S'=S-{i}是背包可装重量为W-w[i]时的最优解,最优解S对应的物品价值为v[i]加上子问题S'对应的物品总价值。
同时考虑到对于任意一件物品i,有两种可能性。(1):i被包含在问题的最优解中 (2):i没有被包含在最优解中。因此n件物品,W重量对应的最大价值是以下两种情况中较大的那个:
(1) n-1件物品,W重量对应的价值的最大值。(也就是说第n件物品没有被包含在最优解中)
(2) n-1件物品,W-w[n]重量对应的价值的最大值+v[n]。(也就是说第n件物品被包含在最优解中,需要解决的问题就变成了其子问题)
如果w[n]>W,则第n件物品