文章目录
什么是贪心算法
贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法 。其实就是希望局部最优能够推导全局最优的策略。
贪心算法实现步骤
贪心算法的实现步骤通常如下:
- 把求解的问题分成若步(或者若干个子问题)。
- 解决每一步的时候(或者每个子问题),都选择当前看起来最优的解法。
- 把每一步(或者每个子问题)的最优解合成原来解问题的一个解。
贪心的三个例子
例一:找零问题
题目就是对方在店里消费了4元,给了你50元,希望你用以下四张纸币[20,10,5,1]以最少的纸币张数找对方零钱。
我们按照贪心的策略,肯定是先选最贵的纸币找零,如果太大了再依次看下一个小的纸币找零。
例二:最小路径和
题目就是在这个九个格子里面你每次只能选择向右和向下走一步,走到哪个格子就将格子里的数字累加,问从左上角到达右下角的最小路径和是多少。
我们按照贪心的策略,选择每一步的最优解,所以第一步肯定是向下走,第二步肯定是向下走,下面就只能向右走了,也就是下图绿色的路线得到的是10。但是最优解其实是紫色那一条路线也就是7。
例三:背包问题
题目就是背包的最大容量是8,问将列表中的三个物件如何组合才能达到最高价值。
我们按照贪心的策略,选择每一步的最优解,但是我们要以什么标准去选择我们每一步的评判标准呢,是以物品的体积,物品的价值还是单位体积所带来的价值呢。
如果以体积去选择,则所带来的价值是8。
如果以价值去选择,则所带来的价值是13。
如果以单位体积所带来的价值去选择,则所带来的价值是13。
但是真正的最优解其实是14。
贪心算法的特点
贪心算法通常具有以下两个特点:
- 贪心选择性质:通过局部最优的选择,能产生全局的最优选择。每一步都采取当前状态下最优的选择,这是贪心算法的核心。
- 最优子结构性质:问题的最优解包含其子问题的最优解。这意味着问题可以分解成子问题来解决,并且子问题的最优解能递推到最终问题的最优解。
其实贪心算法这就是贪婪+鼠目寸光的解法。
注意:从例三就可以看出贪心策略的提出是没有标准的以及模板的,所以每一道题的贪心策略都是不同的。还有就是从例二和例三可以看出虽然每一步都是最优解,但是合起来却不是全局的最优解,所以这只是"希望"让每一步得到最优解从而能够得到的全局解是全局的最优解,但是得到的不一定是全局的最优解。所以我们需要去证明贪心策略的正确性。
贪心策略的正确性
假设我们的最优解使用的纸币的张数,20元的纸币是A张,10元的纸币是B张,5元的纸币是C张,1元的纸币是D张。
首先我们要发现一个性质如果B>=2那么一张A就可以代替它,所以B<=1;同理可以得出C<=1;D<=4;
假设我们贪心策略所使用的纸币张数,20元的纸币是a张,10元的纸币是b张,5元的纸币是c张,1元的纸币是d张。所以就转换成只要证明A=a,B=b,C=c,D=d即可。
第一我们这个一定是a>=A;因为我们的贪心策略是能用20就尽量用20。
接下来我们可以去证明a>A;如果a是大于A的话,那我们剩下的钱只能让B,C,D去凑数,因为总的钱数是不变的,如果a>A那么少的那部分只能用B,C,D去凑。但是我们根本凑不出来,还记得我们前面发现的性质吗,B<=1;C<=1;D<=4;它们三不管怎么凑最多只能是19,所以a是不可能大于A的。
好,那么我们前面得出的a是一定大于等于A的,后面我们又证明a是不可能大于A的,所以a只能等于A,即a=A。
所以剩下的B,C,D凑的钱是一样的了,我们就可以得出b>=B,因为我们的贪心策略是能用最优的就尽量用最优的。凑的钱是一样的时候我们能用10元就尽量用的10元。同理即又可以证明b是不可能大于B的。以下相同的方法就可以得出A=a,B=b,C=c,D=d。所以我们这个贪心策略没有问题的是最优解。
贪心学习方向
遇到不会的很正常,把心态放平,不是每个人他都能想到每道题的最优解。我们前期的学习应该把重点放在贪心的策略上,然后把策略当成经验吸收。如果要想提升的话,就要想到如何去证明这个贪心策略是正确的。