贪心算法理论:
贪心算法接地气的讲就是贪婪加上鼠目寸光,不像我只会心疼哥哥(啊不是)。
贪心算法解题策略:
通过局部寻找最优解,来试图(不一定就是)寻找到全局的最优解。
实现操作如下:
1.先将做题步骤分为若干步,与分治法有部分相似(后半句算法导论说的,我就负责蹭蹭名气)
2.然后在执行若干步时,对每步操作进行当前阶段的最优解(之所以不一定求得全局最优解皆因为此时鼠目寸光的特性,就比如一个贪官收到礼物时,不管未来与前途,在当时看来只有收下有钱,和拒绝没钱这两个选项,然后使用贪心策略选择了收礼,然后g)
3.最后执行若干个步骤的最优解后返回结果,希望得到最优解。
特点:
1.贪心策略的提出
a.贪心策略的提出没有标准与模板,同一道题会有多种贪心的思路在每一步渴求所想要的相对最优解。
例如一个背包装物品,不同物品有不同的价格和体积,想要装进最大的价值东西,使用贪心策略就有从每次装物品装价值最大的或者每次装东西装体积最小的或者每次装东西装价格/体积的值最大的这三种贪心思路(虽然都不对)
b.贪心策略的提出对于每道题都有不同的思路与解法,不能将一道题的思路套用到任意题中(但是并不是说刷题没有用)
2.贪心策略的正确性
因为贪心策略不一定是正确的,可能是个错误方法所以需要论证。(也就是后续会讲到的证明方法,证明方法不只今天提到的一个,后续会继续更新证明方法以及例题,如果想早看到新内容,请动动发财的小手关注我一下哦)
证明方法1:交换论证法
交换论证法就是用知道头脑中的明了了的最优解时,在不改变最优解的前提下,能够将最优解调整为贪心解(现在有点生涩,一会有个例题以及对应解决方法可以结合着看)
例题:力扣题目860柠檬水找零
对数据理解
这里看完题目后我们可以(知道,美国柠檬水贩子真黑心,5dollars一杯,真万恶。)
还有正经的就是知道了我们要处理的数据在1e5的范围内,直接暴力一一枚举出来冲他。
具体实现贪心
操作一
然后这里可以发现我们可以将每一个收到的钱找零的过程看成一个步骤
操作二
我们要处理的数据只有5,10,20.因为没有要用到20找零钱的情况,所以只要判断收到20元时能不能找开钱的情况,不用考虑用20找零钱的情况。
然后收到10元时,直接给五元,或者返回false。
以上两种情况选择固定不需要考虑贪心
但收到20时,就要考虑一下了,一种方式是给3张5元,另一种方式是给1张10元一张5元。
我们思考一下,十元只能用于20元找零,但5元可以用于20元和10元的找零,方便我们给更多的人找零,做更多生意,收更多的dollar,所以我们尽可能的保留5元款。也就是先判断是否有十元,和五元如果都有就给10元和5元。如果没有十元,那就给3张5,如果也没有那就return false
实现代码为:(非最优化代码,做个参考就行)
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
int five=0,ten=0;
for(int i:bills)
{
if(i==5)
five++;
else if(i==10)
{
if(five==0)
return false;
else
five--;
ten++;
}
else
{
if(ten!=0&&five!=0)
{
ten--;five--;
}
else if(ten==0&&five>=3)
five-=3;
else return false;
}
}
return true;
}
};
操作三:
希望得到全局最优解,则就需要我们证明一下了,交换论证法
我们可以知道我们应该尽可能的多做生意,也就i是要求我们能更多的给人找到合适零钱。
这里我们举个对拍来思考,如果我们举了5,10,5,10那我们就发现贪心算法和全局最优解没有区别因为都要遇到5元收着,遇到十元交出5元。所以发现在对于5元和10元时我们不需要调整最优解便已经等于了贪心解。
所以唯一有区别的就是遇到20元时,我们贪心解是先考虑吧10+5.但最优解可能会使用5+5+5.但是10元钱只能用于20元找零,其他情况都用不到给不出去,对于除了20元的情况外没有任何影响,所以在这20元的情况中,我们可以将最优解的5+5+5换成10+5(并不是因为考虑多做生意等什么考虑因素,单纯是因为,两张五块换成十块也不会对此次20元情况有影响)
所以这里最优解的20元情况调整成了贪心解的情况且没有影响到最优解。所以论证成功。文章来源:https://www.toymoban.com/news/detail-778737.html
请公主少爷点赞收藏加关注文章来源地址https://www.toymoban.com/news/detail-778737.html
到了这里,关于简单到爆炸der贪心算法学习及其证明方法其一:交换论证法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!