当前位置: 首页 > 科技观察

双“十一”大促?用贪心算法打败他!

时间:2023-03-22 15:32:20 科技观察

本文转载自微信公众号“Java中文社区”,作者雷哥。转载本文请联系Java中文社区公众号。近年来,商家为了刺激消费,通过不同方式推出了各种活动。以多多为首的运营电商,让我们看到了营销的无限“潜力”。这不,最近刚好赶上双11,小区便利店老王头也推出了“空酒瓶换酒”的促销活动。它的规则如下。本文已收录在Github《小白学算法》系列:https://github.com/vipstone/algorithm活动规则购买X瓶酒的顾客可以用Y个空酒瓶换取一瓶新酒。提示:X和Y的取值如下:1<=X<=1002<=Y<=100Y值不固定,是随机选择的。瓶子里的酒喝了,瓶子就空了。请计算你最多可以喝多少瓶酒。示例1:输入:X=9,Y=3输出:13解释:你可以用3个空酒瓶换取1瓶酒。所以最多可以喝9+3+1=13瓶酒。示例2:输入:X=15,Y=4输出:19解释:您可以用4个空酒瓶换取1瓶酒。所以最多可以喝15+3+1=19瓶酒。例3:输入:X=5,Y=5输出:6例4:输入:X=2,Y=3输出:2解题思路这道题有两个难点:一是要更换多少个空瓶子一瓶酒不固定(随机);第二,喝完兑换的酒,可以继续参加兑换活动。所以,在满足这两个前提的情况下,计算一下你最多能喝多少瓶。可能有些朋友看到本文标题就知道解题的思路了。是的,我们将在本文中使用“贪心算法”来计算最终答案。同时,这道题也符合贪心算法的解题思路,即能交换多少就交换多少。贪心算法(GreedyAlgorithm),又称贪心算法,是在每一步选择中,取当前状态下最好或最优(即最有利)的选择,希望导致最优或最有利的选择结果。优秀的算法。贪心算法在具有最优子结构的问题中特别有效。最优子结构是指局部最优解可以决定全局最优解。简单的说就是可以将问题分解成子问题来求解,子问题的最优解可以推导出最终问题的最优解。贪心算法的实现框架从问题的初始解开始:while(可以朝着给定的总体目标迈出一步){使用可行的决策来寻找一个可行的解元;}将所有的解元组合成一个可行解的问题。注意:因为贪心算法只能通过求解局部最优解策略来达到全局最优解,所以,我们一定要注意判断问题是否适合贪心算法策略,找到的解是否一定是最优解的问题。接下来,我们将通过代码来演示贪心算法的具体实现。代码实现1:贪心首先,我们先将全局问题转化为局部问题:当一个空瓶子可以换成一瓶酒时,我们就换一瓶酒。实现代码如下://贪心1:用+和-实现classSolution{publicintnumWaterBottles(intnumBottles,intnumExchange){//最大瓶数inttotal=numBottles;//如果有瓶就交换while(numBottles>=numExchange){//执行一轮交换numBottles-=numExchange;++total;//再交换一次一瓶酒++numBottles;}returntotal;}}代码分析实现思路:先把酒喝光inttotal=numBottles;如果有足够的空瓶,换一瓶酒并执行一个while循环;循环中,空瓶数+1,可喝饮料数+1;执行下一轮判断。我们把上面的代码提交给了LeetCode,执行结果如下:代码实现2:贪心改进上面的贪心算法是一瓶酒进行一次循环赎回,那么我们每次能不能赎回所有的空瓶子(可兑换)最大值值),然后把兑换的酒喝光再进行下一次兑换?答案是肯定的,我们只需要使用取模和取余运算即可实现。具体代码如下://贪心2:使用//and%implementclassSolution{publicintnumWaterBottles(intnumBottles,intnumExchange){//总瓶数inttotal=numBottles;//如果有酒瓶就交换while(numBottles>=numExchange){//最多兑换的新酒intn=numBottles/numExchange;//累计酒瓶总数+=n;//剩余酒瓶数(剩余未兑换+兑换消费)numBottles=numBottles%numExchange+n;}returntotal;}}我们把上面的代码提交到LeetCode,执行结果如下:总结贪心算法乍一看似乎“难”,但实现起来却非常简单。其实“算法”也是一样的。乍一看,这个词似乎很难说是高级的。其实它只是解决某个问题的一种思路和固定的“套路”,并没有什么玄机可言。人们常说:路虽远,终将至;尽管事情很困难,但他们会成功。“难”和“易”总是相对的,其实从“难”到“易”是一个逐渐悟道和成长的过程。愿你每天都成长一点,最后留下个人微信:GG_Stone,互相交流,共同进步。参考和致谢https://leetcode-cn.com/problems/water-bottles/https://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741375.htmlhttps://zh.wikipedia.org/zh-hans/贪心算法