知识回顾

贪心算法 (greedy algorithm),又称贪婪算法。 是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。

贪心算法在 有最优子结构 的问题中尤为有效。最优子结构的意思是 局部最优解能决定全局最优解 。 简单地说,问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解。

贪心算法 与 动态规划 的 不同在于 它对每个子问题的解决方案都做出选择,不能回退 。 动态规划则会保存以前的运算结果,并根据以前的结果对当前进行选择,有回退功能。

贪心法可以解决一些最优化问题,如:求图中的最小生成树、求哈夫曼编码……对于其他问题,贪心法一般不能得到我们所要求的答案。一旦一个问题可以通过贪心法来解决,那么贪心法一般是解决这个问题的最好办法。由于贪心法的高效性以及其所求得的答案比较接近最优结果,贪心法也可以用作辅助算法或者直接解决一些要求结果不特别精确的问题。在不同情况,选择最优的解,可能会导致辛普森悖论(Simpson's Paradox),不一定出现最优的解。

换酒问题

题目描述:

小区便利店正在促销,用 N 个空酒瓶可以兑换一瓶新酒,你购入了 M 瓶酒。如果喝掉了酒瓶中的酒,那么酒瓶就会变成空的,请你计算最多能喝到多少瓶酒?

示例1:

输入: M = 9, N = 3

输出: 13

解释: 你可以用 3 个空酒瓶兑换 1 瓶酒。所以最多能喝到 9 + 3 + 1 = 13 瓶酒。

示例2:

输入: M = 11, N = 3

输出: 16

解释: 你可以用 3 个空酒瓶兑换 1 瓶酒。所以最多能喝到 11 + 3 + 1 + 1 = 16 瓶酒。

问题分析:

喝完当前所有酒后得到的空瓶加上已有空瓶,最大限度的、贪心的兑换酒,依次类推,直到手上的空瓶不足以兑换出一瓶酒为止。

代码实现:

public static int drink(int m, int n) {    int drinked = m;      // 已经喝到的酒数    int empty = m;        // 空酒瓶的数量    while ((empty / n) != 0) {        int changed = empty / n;        // 换酒        drinked += changed;             // 将换的酒喝掉        empty = changed + empty % n;    // 此时空酒瓶的数量    }    return drinked;}

总结一下

当我们解决问题时,我们的切入点很重要,我们解决喝酒问题时 切入的并不是起始点 , 而是从喝完所有你购入的酒后开始 ,为什么要这样呢?看图可知,因为 后续的操作才是贪心算法的体现 ,每一个环节的 思想是一样 的。

  • 第一步, 看当前空酒瓶是否能够兑换到酒 , 如果可以,执行下面的操作 ; 如果不可以,问题解答完毕,返回已经喝到的酒数。
  • 第二步, 将当前的空酒瓶最大限度的、贪心的兑换酒 。
  • 第三步, 喝掉所有兑换到的酒,得到空酒瓶 。
  • 第四步, 统计当前空酒瓶的数量 , 兑换前剩余的 加上 已经喝完的兑换的酒的空瓶 , 重复第一步 。

写在最后

下面这本书从一系列有趣的生活实例出发,全面介绍了构造算法的基础方法及其广泛应用,生动地展现了算法的趣味性和实用性。全书分为两个部分,第一部分介绍了算法的概念、常用的算法结构以及实现方法,第二部分介绍了算法在各个领域的应用,如物理实验、计算机图形学、数字音频处理等。其中,既有各种大名鼎鼎的算法,如神经网络、遗传算法、离散傅里叶变换算法及各种插值算法,也有不起眼的排序和概率计算算法。讲解浅显易懂而不失深度和严谨,对程序员有很大的启发意义。书中所有的示例都与生活息息相关,淋漓尽致地展现了算法解决问题的本质,让你爱上算法,乐在其中。

喜欢的朋友可以转发+关注后私信“666”免费获取。

java调度问题的贪心算法_贪心算法——换酒问题相关推荐

  1. 常用十大算法_回溯算法

    回溯算法 回溯算法已经在前面详细的分析过了,详见猛击此处. 简单的讲: 回溯算法是一种局部暴力的枚举算法 循环中,若条件满足,进入递归,开启下一次流程,若条件不满足,就不进行递归,转而进行上一次流程. ...

  2. cb32a_c++_STL_算法_查找算法_(5)adjacent_find

    cb32a_c++_STL_算法_查找算法_(5)adjacent_find adjacent_find(b,e),b,begin(),e,end() adjacent_find(b,e,p),p-p ...

  3. prim算法_贪心算法详解(附例题)

    贪心算法的特征规律 贪心算法,"贪心"二字顾名思义,因此其规律特征就是更加注重当前的状态,贪心法做出的选择是对于当前所处状态的最优选择,它的解决问题的视角是微观的"局部& ...

  4. 回溯算法和贪心算法_回溯算法介绍

    回溯算法和贪心算法 回溯算法 (Backtracking Algorithms) Backtracking is a general algorithm for finding all (or som ...

  5. java寻优算法_模拟退火算法SA原理及python、java、php、c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径...

    模拟退火算法SA原理及python.java.php.c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径 模拟退火算法(Simulated Annealing,SA)最早的思 ...

  6. 数据挖掘算法_数据挖掘算法入门

    有南方的朋友讲过北方人喜欢打比方,尤其是甲方的,其实也没什么不好了.如果是做菜的话,那么这些算法就相当于烹饪的工具了.对原始的食材进行预处理.加工整合,选择合适烹饪工具,以及对应的方法步骤,最后收获舌 ...

  7. python序列模式的关联算法_关联算法

    以下内容来自刘建平Pinard-博客园的学习笔记,总结如下: 1 Apriori算法原理总结 Apriori算法是常用的用于挖掘出数据关联规则的算法,它用来找出数据值中频繁出现的数据集合,找出这些集合 ...

  8. 滴滴派单算法_从算法模型思路到评估方案 - 详解

    导读:说到滴滴的派单算法,大家可能感觉到既神秘又好奇,从出租车扬召到司机在滴滴平台抢单最后到平台派单,大家今天的出行体验已经发生了翻天覆地的变化,面对着每天数千万的呼叫,滴滴的派单算法一直在持续努力让 ...

  9. 接受拒绝算法_通过算法拒绝大学学位

    接受拒绝算法 数据科学 (Data Science) Nina was close to tears when she accused Nick Gibb of ruining her life. N ...

最新文章

  1. 2019-4:自考总结
  2. 计算机组成知识试题及答案,《计算机组成与结构复习题及答案.doc
  3. JavaScipt中的Math.ceil() 、Math.floor() 、Math.round()
  4. Ribbon为什么要加入点对点直连的功能?如何操作?两句话玩转!
  5. 进程间通信————有名管道
  6. [导入]身份验证方面的问题
  7. 【笔记】JAVA 中国象棋游戏 部分源码
  8. 【Tomcat】安装Tomcat服务器Tomcat的目录结构
  9. 实现自己的Linq to Sql
  10. Windows 8 Directx 开发学习笔记(十四)使用几何着色器实现三角形细分
  11. Atitit常见需求分析方法与工具链 attilax大总结
  12. 基于VHDL语言分频器电路程序设计
  13. 数据分析SQL环比增长率、同比增长率
  14. 那些3年前转行做自媒体的站长,现在都怎样了?
  15. 真菌元胞自动机Python实现
  16. 解决华硕电脑Ubuntu16.04连接不上wifi的问题
  17. VMware安装WinXP蓝屏及激活
  18. Python量化交易|pd.expanding() VS pd.rolling() 时间窗口函数区别图解
  19. PC 微信 Hook 实战记录 1: 找到个人信息
  20. GO语言reflect反射篇

热门文章

  1. 在ubuntu16上新创建了一个用户,通过xrdp远程连接时出现灰屏,鼠标是“x”号
  2. mysqldump方式导出mysql
  3. 解决本地工具无法连接服务器上的mysql的问题
  4. golang读写excel
  5. JS PopupAlert
  6. 如何在.Netcore控制台应用中使用依赖注入(4)
  7. 进程和应用程序生命周期
  8. 关于html中对换行的处理
  9. BigDecimal数据加法返回值接收
  10. C#项目打包后安装的桌面快捷方式图标怎么设置成自己想要的图标