vlambda博客
学习文章列表

背包问题Ⅱ——是动态规划还是贪心算法?


     ,我们从0-1背包问题探索了两种动态规划方法,从蛮力枚举(递归)-带备忘递归(自顶向下法)-递推求解(自底向上的表格法)。其中,带备忘的递归方法和递推求解的方法都属于动态规划(dynamic programming),它们的核心在于如何高效地构建备忘录,进而提高问题求解的效率(在这里,“programming”指的是一种表格法,并非编写计算机程序)。


背包问题Ⅱ——是动态规划还是贪心算法?

     

     这两种方法既有相同也有不同之处,它们都是通过分解原始问题,找出小规模问题和大规模问题之间的关系,最后通过备忘录由子问题向原始问题扩展。它们之间的区别在于,带备忘的递归是自顶向下的递归+自底向上的反推,然而,递推求解忽略了带备忘递归中自顶向下的过程,只要自底向上的过程,所以更为高效。





     虽然,我们已经学习了,并且它能够解决很多最优化问题,但是对于一些最优化问题来说,使用动态规划确有一点“杀鸡用牛刀”的感觉,明明还可以使用一种更简单、更高效的算法。贪心算法就是这样的算法,在每一步都做出当时看起来最佳的选择,并寄希望这样的选择能够导致全局最优解


     下面我们就来看看贪心算法到底有多“贪心”?如何才能调出一杯最“贵”的饮料呢?

背包问题Ⅱ——是动态规划还是贪心算法?

背包问题Ⅱ——是动态规划还是贪心算法?


     我记得上一篇小迷糊说,当遇到实际问题时,一定要先对其进行形式化定义。

背包问题Ⅱ——是动态规划还是贪心算法?


背包问题Ⅱ——是动态规划还是贪心算法?

背包问题Ⅱ——是动态规划还是贪心算法?
背包问题Ⅱ——是动态规划还是贪心算法?

     为什么我觉得这两个问题的形式化定义好像哦!当部分背包问题中xi的取值为0或1时,就变成了0-1背包问题。那0-1背包问题是不是也可以用贪心算法来求解呢?

背包问题Ⅱ——是动态规划还是贪心算法?

背包问题Ⅱ——是动态规划还是贪心算法?

     好像不太对哦,0-1背包用贪心策略并没有得到最优解,那部分背包呢?

背包问题Ⅱ——是动态规划还是贪心算法?

背包问题Ⅱ——是动态规划还是贪心算法?


     如何证明此时贪心选择的正确性(每个步骤做出的贪心选择能生成全局最优解)呢?

背包问题Ⅱ——是动态规划还是贪心算法?

背包问题Ⅱ——是动态规划还是贪心算法?

      通常来说,用替换法证明每个子问题的贪心选择,假设存在(非贪心解的)最优解,如果它可以经过有限的步骤替换成贪心解,即证明此贪心解为最优解。




     背包问题Ⅱ——是动态规划还是贪心算法?

     

     假设存在一个最优解S*,无论是最优解S*还是贪心解S’都会盛满液体,假设我们将两杯中的饮料都按照性价比由低到高排好顺序。如果在一开始都放入性价比最高的液体,并且放入的体积相同,则最优解和贪心解相同。假设在红色液体部分,放入最优解的体积少于贪心解(贪心解中只有最后一个物品是装不满的,其余能装入杯中的液体一定会全部装入杯中),如果我们把红框中的蓝色液体替换成(贪心解中的)红色液体,这样做是不亏的,因为红色液体的性价比高于蓝色液体贪心解中液体按照性价比递减的顺序排序)。在剩下的子问题中当最优解与贪心解不等时,仍然用这种方法进行替换,最后我们发现把最优解替换成贪心解后液体的总价值并没有减少,因此我们可以说贪心解不劣于最优解,即此贪心解为最优解


背包问题Ⅱ——是动态规划还是贪心算法?

     那为什么0-1背包用贪心策略得不到最优解,而部分背包却可以呢?

背包问题Ⅱ——是动态规划还是贪心算法?



     首先它们的问题定义不同,0-1背包中的物品是不可分割的,而部分背包中的物品可分割。


背包问题Ⅱ——是动态规划还是贪心算法?


     这就导致贪心策略无法装满背包(还剩下3个体积无法再装入任何物体),空闲空间降低了方案的有效价值。而在0-1背包中,当我们考虑是否将一个商品装入背包时,必须比较包含此商品的子问题的解不包含子问题的解(KnapsackSR(h,i,c)=max{KnapsackSR(h,i-1,c-vi)+pi,KnapsackSR(h,i-1,c)})才能做出选择。这会导致大量的重叠子问题——动态规划的标识。


背包问题Ⅱ——是动态规划还是贪心算法?
背包问题Ⅱ——是动态规划还是贪心算法?
背包问题Ⅱ——是动态规划还是贪心算法?
本篇小结

    贪心算法的一般步骤:提出贪心策略,证明策略正确。


背包问题Ⅱ——是动态规划还是贪心算法?

     

     虽然,贪心算法并不能保证最优解,但是对于很多问题确实可以求得最优解,而且是一种强有力的算法设计方法,可以很好地解决很多问题,但是我们一定要能够证明贪心算法的正确性才可以使用贪心算法哦~



贪心or动态规划?

相同点:都具有最优子结构的性质(一个问题的最优解包含其子问题的最优解)——是能否应用动态规划和贪心算法的关键要素。

不同点:贪心选择时仅做出当前问题中看来最优的选择,而不必考虑子问题的解。



子问题

子问题的解

求解过程

贪心算法

最优子结构

不依赖

自顶向下

动态规划

最优子结构

依赖

自底向上

      下一篇我们就来看看什么样的问题既可以用贪心算法也可以用动态规划求解呢?