简单到爆炸der贪心算法学习及其证明方法其一:交换论证法

贪心算法理论:

贪心算法接地气的讲就是贪婪加上鼠目寸光,不像我只会心疼哥哥(啊不是)。

贪心算法解题策略:

通过局部寻找最优解,来试图(不一定就是)寻找到全局的最优解。

实现操作如下:

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元情况调整成了贪心解的情况且没有影响到最优解。所以论证成功。

请公主少爷点赞收藏加关注

  • 50
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值