最近算法课讲到贪心算法,感觉书本上对部分背包贪心选择性质的分析有点笼统,思路模糊。下面我以自己的理解,用数学归纳法对其整理了一下。欢迎大家一起讨论。
部分背包问题贪心选择性质的证明
贪心选择性质:问题的整体最优解可以由一系列子问题的最优选择,既贪心选择得到。
问题描述:假设有n个物体C1,n分别标记为:1, 2, …, n。其价值分别为:V1, V2,…, Vn,重量分别为:W1, W2, …, Wn。背包的容量为W。则部分背包问题可以描述为:存
在一个n元向量(X1, X2, …, Xn),在 的条件(记为条件1)下,背包的总价值 最大(其中0≤Xi≤1)。假设C1,n的标号是
按照单位价值Vi/Wi从大到小排好序的,即:V1/W1 > V2/W2 > … > Vn/Wn。如果不是,则对C1,n重新编号即可。
于是部分背包问题的贪心选择性质可以描述为:每次从Ci,j中选择物品,都是优先考虑选择物品i,且在满足条件1的情况下,Xi 越接近1越好。下面用数学归纳法证明这一贪心选择性质:
记Ai,j为从物品Ci,j中选择装进背包的最优解,则原问题为求A1,n。再记k为第k次从C中选物品进背包。则:
Ⅰ)当k=1时,满足贪心选择性质,即第一次选物品p进背包,且p=1。下面用反证法证明:
若p≠1,则p≥2。但在此情况下不能保证A1,n最优。试考虑W1=W的情况下,另外一个解A1,n’={1}的价值V’更大(因为V1/W1 > V2/W2 > …> Vn/Wn)。既A1,n不是最优解,产生矛盾。所以p=1。
Ⅱ)在满足条件1的情况下,假设k≤z时,满足贪心选择性质。既前z(包括z)次从Cz,n中选择物品,都是优先考虑选择物品z,且在满足条件1的情况下,Xi 越接近1越好。
Ⅲ)在满足条件1的情况下,当k=z+1时,证明也满足贪心选择性质,既第k=z+1次选物品(z+1)。
先证明A1,n的子问题Az+1,n也具有最优性质:如果存在Cz+1,n中选择物品的子问题的解Az+1,n’的总价值比Az+1,n的总价值更大,那么Az+1,n’与A1,z合并后的原问题的解A1,n’的总价值比A1,n的总价值更大。这与A1,n是最优解矛盾。所以Az+1,n也具有最优性质。
于是第k=z+1次选择物品等价于子问题Az+1,n的第一次选择物品,又因为在Ⅱ)假设成立的情况下,C1,n的前z个物品已经被选了,所以转换成Az+1,n从Cz+1,n中选择第一个物品。根据Ⅰ),显然优先选择物品(z+1)。所以结论得证。
∴ 综合Ⅰ)Ⅱ)Ⅲ),得证部分背包问题具有最优选择性质。