贪心算法
贪心算法没有模版,它其实是一种策略:局部最优->全局最优
策略分三步:
- 将解决问题的步骤分为若干步
- 解决每一步的时候,都选择当前看起来最优的解法
- 希望得到全局最优解
例1 找零问题
比如对于我们的找零问题,假如你要找对面46块钱,你手里只有1块、5块、10块、20、50面额的纸币,你肯定是会先从这些纸币中拿一张面额最大的找给对面,因为面额最大就意味着纸币的张数最少。由于50比46大,所以没法找50的,于是就找剩余的纸币中面额最大的(也就是20的)。找完之后发现还要找26块钱,同理我们再找给对面一张20的,然后发现还要找给对面6块,同理选不大于6块的面额最大的纸币5块,最后找给对面1块。通过模拟我们就可以看到,我们每次选取纸币时,选的策略都是从纸币库里面选一张面额尽可能大的纸币,这就是贪心策略
例2 最小路径和
可以简单看一下下面这个例子,如果采用贪心策略,我们就规定每次走的时候,都从相邻格子(下方和右方的格子)中选择值最小的格子走

例3 背包问题
这个就是动态规划中的一个非常经典的问题。总结来说就是有n件物品。告诉你每件物品的重量和价值。背包的承重是有限的,让你求的是怎么样选这些物品,才能够让背包里装的东西价值最大。
那么对于这个问题,我们能够想到的贪心策略有三种。
- 第一种策略,既然他要我求的是最多能装多少价值的物品?那我每次选物品时我都选剩余物品中价值最大的物品。
- 第二种策略,既然他给我的限制是包容量,那我每次就都从剩余物品中选一个占地空间最少的,也就是最轻的物品。
- 第三种策略就是拿一个物品的价值除以这个物品的体积就可以算出它单位体积的价值。我们就每次就从剩余物品里选出这个单位体积价值最大的物品
对于下面这个问题来说,他最优方案就是选两个体积为四的物品二,这种方案是最优的,就是价值最大的,但是如果我们采用上面三种策略,算出的答案都是错的。也就是说其实贪心算法可能并没有我们想的那么简单,简单的贪心算法是没办法有效解决问题的

贪心算法的特点
通过上面的例子,我们可以看出其实谈心算法的总体思想就是贪婪加鼠目寸光。就是说我不管整体的布局,我每一次都选一个局部对我来说最有利的情况。
- 贪心策略的提出
贪心策略的提出是没有标准以及模板的,可能每一道题的贪心策略都是不同的 - 贪心策略的正确性
因为你提出的“贪心策略”很有可能是一个错误的方法,所以当我们想要使用贪心算法去解决一个问题时,你不仅要自己想出贪心算法,你还要证明他是对的。
这上面举的三个例子中。只有第一个找零问题,我们提出的贪心算法是正确的。其余的两个例子中我们提出的参与算法都是不对的。对于不对的贪心算法,我们只需要找一个反例去反驳。但是对于政策的贪心算法,我们就要给出严格的数学证明来证明他为什么是对的,那么下面我们就给出第一个例子中贪心算法的证明。
首先我们就要根根据这个问题找出几条性质。就是在最优的解法中,10块钱的张数不可能超过一张,5块钱的张数也不可能超过一张,1块钱的张数不可能超过四张。这个原因就是因为我们的要求:在找给对方确定金额的条件下,要求纸币的张数最少。如果说10块钱的张数。两张或者两张以上。那我一定能够将两张10块的换成一张20的。就是说两张10块和一张20的在金额上是等效的,但是一张20的。这纸币的张数要比两张10块的要少。更符合我们最优解的要求,所以两张10块的一定不是最优解。反过来说最优解法中10块钱的张数不可能是两张或者两张以上。5块钱和1块钱的范围也是一样。
然后我们就来看我们贪心的策略。就是如果能选20的我们就都选20的。优先选20选不动了,再去选10块的。所以我们贪心策略这种选取的方法,在所有的选取方法中20块钱的张数选的肯定是最多的。最优解法作为众多选取方法中的一种。他选的20块钱的张数也不可能多于我贪心算法。也就是说最优解中20块钱的张数是小于等于贪心算法方案中20块钱的张数的。下面我们继续假设。最优解中20块钱的张数小于贪心算法中20块钱。那么由于两种方案中选取纸币的金额是相同的,这个是题目的条件,那么最优解中少的那张20块就要由后边儿的10块,5块和一块来补。但是根据我们前面的性质,10块钱最多一张,5块钱最多一张,1块钱最多4张。这些纸币都取最大加一起也就19块钱,凑不到20,就没法去补。因此我们假设不成立,最优解法中20块钱的张数不可能小于贪心解法中20块钱的张数。那因此解法中20块钱的张数只能等于贪心解法中20块钱的张数。后面的10块,5块和一块都是同理的。最终我们就可以证明最优解中20,10块,5块,1块钱的张数和贪心算法中的张数都是是一样的,因此贪心算法就是最优解。证毕

学习贪心算法的策略
感觉这个应该就和你大学里面学数学的思路差不多。就是每道数学证明题它都有非常严格的、完整的证明,但是这个证明你一开始就非常难想到,你要做的事情就是去拜读这些数学大家做出的典范解法,感悟其中的精髓,然后写出你自己的解法
这个贪心算法也是一样。可能题目都有他最优的一个贪心策略,但这个策略你很有可能想不到。那么你在学习的时候要做的就是去学习这些最优的贪心策略的设计方法。然后搞明白为什么他在这种情况下就是正确的。然后下一次再碰到类似情景的时候,你就可以非常准确的判断出这种情况下用这种贪心算法是正确的,然后去解题。
1025

被折叠的 条评论
为什么被折叠?



