部分揹包问题的贪心算法正确性证明

一,部分揹包问题的贪心算法

部分揹包问题可以用贪心算法求解,且能够得到最优解。

贪心策略是什么呢?将物品按单位重量 所具有的价值排序。总是优先选择单位重量下价值最大的物品。

单位重量所具有的价值:Vi / Wi

举个例子:假设揹包可容纳50Kg的重量,物品信息如下:

物品 i      重量(Kg)      价值           单位重量的价值

1             10          60                 6

2             20          100               5

3             30          120               4

按照我们的贪心策略,单位重量的价值排序: 物品1 > 物品2 > 物品3

因此,我们尽可能地多拿物品1,直到将物品1拿完之后,才去拿物品2…..

最终贪心选择的结果是这样的:物品1全部拿完,物品2也全部拿完,物品3拿走10Kg(只拿走了物品3的一部分!!!)

这种选择获得的价值是最大的。

二,部分揹包问题的贪心策略的正确性证明

贪心策略是:总是优先选择单位重量下价值最大的物品

正确性证明 是:使用该贪心策略,可以获得最优解。在这里,最优解就是带走的物品价值最大。

证明思路:先考察一个全局最优解,然后对该解加以修改(一般是采用“剪枝”技巧),使其采用贪心选择,这个选择将原问题变成一个相似的、但是更小的问题。

先假设 物品集合S={W1,W2….Wn}已经按 单位重量价值从小到大排好序了。

并假设 一个全局最优解是:S(i)={Wi1,Wi2,…..Win}。Wi1,Wi2,…..Win是有序的。对于贪心选择而言,总是会优先 选择 Wn 的物品,当Wn 没有后,再选择Wn-1 …..

如果Win = Wn 问题已经得证。因为,我们的最优解S(i)中,已经包含了贪心选择。只要继续归纳下去,Wi(n-1) 就是 Wn-1 ….

如果Win != Wn 运用剪枝技巧,剪掉Win 并 贴上 Wn  此时,得到的是一个更优的解(因为价值更大了 ,Wn > Win)。因为,Wn 是单位重量价值最高的那个物品啊,我们的贪心选择应该选择它,但是这里的最优解S(i)却没有选择它,于是我们用剪枝技巧,将它加入到S(i)中去,并把S(i)中的Win除去。  

这就证明了,如果用贪心策略来进行选择,得到的是最优解。从而证明了贪心算法的正确性。

其实,也就是证明了一定存在一个最优解,这个最优解就是由贪心选择组成的。

原文链接

点赞