硬币找零问题是动态规划的一个经典问题,其中最少硬币找零是一个变种,本篇将参照上一篇01背包问题的解题思路,来详细讲解一下最少硬币找零问题。如果你需要查看上一篇,可以点击下面链接:

详解动态规划01背包问题--JavaScript实现

下面让我们开始吧。

问题

给定4种面额的硬币1分,2分,5分,6分,如果要找11分的零钱,怎么做才能使得找的硬币数量总和最少。

分析

最少硬币找零问题,是为了求硬币的组合,所以一个大前提是硬币无限量供应。我们建立如下表格来分析问题:

其中每列用j表示零钱总额,每行i表示硬币面额。T[i][j]表示硬币个数,它是我们即将填入表格的数字。

在填写表格之前,我们需要先明确几个规则:

当填写第i行时,使用的硬币面额仅能是i以及小于i的面额。举个例子,比如我填写第0行,i=0,那么这一样只能使用面额为1分的硬币。当我填写第2行,i=2,那么可以使用1分,2分,5分三种面额的硬币。

当填写第j列时,表示当前需要使用硬币凑出的总额。比如j=6,表示需要使用硬币组合出总额为6分的情况。

1. i = 0

当我们只能使用面额为1分的硬币时,根据上面的规则,那么很显然,总额为几分,就需要几个硬币。即T[i][j] = j。

2. i = 1

当我们有1分和2分两种面额时,那么组合方式就相对多了点。

i=1 j = 1:总额为1时,只能使用1分的面额。即填1。

i=1 j = 2:总额为2时,可以使用2个1分的,也可以使用1个2分的。因为我们要求最少硬币,所以使用1个2分的。表格所表达的意思是硬币的数量,所以这里也填1。

i=1 j = 3:总额为3时,可以使用3个1分的,也可以使用1个1分加1个2分。因此这里应该填2。

i=1 j = 4:总额为4时,可以使用4个1分的,可以使用2个1分加1个2分,也可以使用2个2分。其中硬币最少的情况应该是2个2分。因此这里填2。

i=1 j = 5:总额为5时,组合就更多了,但是聪明的你应该能想到使用2个2分加1个1分,可以实现最少硬币的需求。因此这里填3。

我们来看填写完上面5格后的情况:

建议你自己再纸上照着我这图画一个表格。接下来,别急着填表。我们要根据已有的数据,总结出T[i][j]的规律,然后通过填写剩余表格来验证。

我们将硬币面额使用数组coins[i]来表示,根据表格有 1分=coins[0], 2分=coins[1]。

当j

当j>=coins[i]时,根据已有的 i=1行可以推出一个规律,令a = 1+T[i][j-coins[i]],T[i][j]= min(T[i-1][j],a),即二者比较取最小值。可能一开始你看到这个关于a的公式,有点太突然,难以接受。稍微解释一下,当第i行,优先选择这一样的硬币,因为这一行的硬币面额最大,最有可能使得总硬币数量最少。因此j-coins[i],就很好理解了,就是选择了这一行的硬币后,还剩下多少总额。举个例子,当i=1,j=3时,j-coins[1]=1。那么选择2分后,还剩余总额为1,这时候我们再定位到i=1,j=1,即T[1][1],它的值为1,再加上一个常数1,即得最终结果2。

再举例,i=1 j=5。由于是从左到右填表的,所以i=1,j<5的表格都填完了。j-coins[i]=3,定位到T[1][3]=2,加上常数1,即得最后结果T[1][5]=3。

其实公式本身很短,也很好记。如果实在无法理解,建议先不用纠结。先最小化浏览器,不要看本篇剩余的内容。带着这个解题公式,自己在纸上,把这个表格填写完整,在填表分析的过程中就能慢慢理解了。

3. 剩余内容

按照上一步所提供的公式,其实所有的T[i][j]都可以填完了。如下表格。

建议先自己再纸上填表,填完了,再和我的图对比一下,看是否答案存在出入。

4.伪代码

以上的填表逻辑,使用伪代码表示如下

if(i == 0){

T[i][j] = j/coins[i]; //硬币找零一定要有个 最小面额1,否则会无解

}else{

if(j >= coins[i]){

T[i][j] = min(T[i-1][j],1+T[i][j-coins[i]])

}else{

T[i][j] = T[i-1][j];

}

}

复制代码

5. 寻找组合

至此,填完表格我们已经接近完成了。接下来要寻找从表格中寻找硬币组合。

java动态规划凑硬币问题,详解动态规划最少硬币找零问题--JavaScript实现相关推荐

  1. java最少钱币数_最少钱币数(凑硬币)详解-2-动态规划算法(初窥)-CCF-CSP练习题(100)...

    目录 这篇使用动态规划算法来解决这个问题,借这篇博客初窥动态规划算法.最少钱币数问题也可以看作多重背包问题. 那么什么是动态规划算法? 动态规划(dynamic programming,DP)是运筹学 ...

  2. 详解动态规划最长公共子序列--JavaScript实现

    前面两篇我们讲解了01背包问题和最少硬币找零问题.这篇将介绍另一个经典的动态规划问题--最长公共子序列.如果没看过前两篇,可点击下面链接. 详解动态规划最少硬币找零问题--JavaScript实现 详 ...

  3. 详解动态规划01背包问题--JavaScript实现

    对其他动态规划问题感兴趣的,也可以查看 详解动态规划最少硬币找零问题--JavaScript实现 详解动态规划最长公共子序列--JavaScript实现 一开始在接触动态规划的时候,可能会云里雾里,似 ...

  4. Java中的static关键字详解

    ** Java中的static关键字详解 ** 在一个类中定义一个方法为static,即静态的,那就是说无需本类的对象就可以调用此方法.调用一个静态方法就是 "类名.方法名" ,静 ...

  5. java中的进制输出转换_Java I/O : Java中的进制详解

    作者:李强强 上一篇,泥瓦匠基础地讲了下Java I/O : Bit Operation 位运算.这一讲,泥瓦匠带你走进Java中的进制详解. 一.引子 在Java世界里,99%的工作都是处理这高层. ...

  6. 《Java和Android开发实战详解》——2.5节良好的Java程序代码编写风格

    本节书摘来自异步社区<Java和Android开发实战详解>一书中的第2章,第2.5节良好的Java程序代码编写风格,作者 陈会安,更多章节内容可以访问云栖社区"异步社区&quo ...

  7. Java中的main()方法详解

    源文作者:leizhimin    源文链接:http://lavasoft.blog.51cto.com/62575/53263 源文作者版权申明: 版权声明:原创作品,允许转载,转载时请务必以超链 ...

  8. java的动态代理机制详解

    2019独角兽企业重金招聘Python工程师标准>>> 参考资料 1.java的动态代理机制详解 转载于:https://my.oschina.net/Howard2016/blog ...

  9. java中Freemarker list指令详解

    java Freemarker中list指令主要是进行迭代服务器端传递过来的List集合. 定义 <#list nameList as names> ${names} </#list ...

最新文章

  1. 魔兽世界服务器位面 稳定,因抗议《魔兽世界》位面技术在RP服务器中被取消
  2. gradle项目 避免每次下载gradle文件/解决依赖下载慢的问题
  3. boost::math::tools::luroth_expansion用法的测试程序
  4. HTML中各种 div 位置距离关系
  5. C#通用类库--短信猫操作类1(原始AT命令)
  6. SSM整理笔记1——SSM网站初步功能设计
  7. virtualbox虚拟机安装Ubuntu异常处理:FATAL: NO bootable medium found! System halted
  8. 重负载Telnet BBS系统优化和维护经验谈
  9. linux下python网络编程框架-twisted安装手记,Linux下Python网络编程框架-Twisted安装手记 | 学步园...
  10. 倾斜摄影测量数据的一些简析
  11. 银河麒麟桌面V10微信不能登录
  12. VUE输入 身份证 号,获取出生年月日
  13. LeetCode第714题解析
  14. 成长路上破局思维:工具化时间管理
  15. ASO检索规则-热词覆盖如何来做?
  16. Gvim插件NERDTree安装
  17. 多边形等距放缩原理与python实现
  18. 某位算法工程师对自己工作的反思
  19. BLDC的三闭环控制
  20. 【SAS】format和informat

热门文章

  1. 所有库在门不显示封装_COB全天候通透屏,在商业显示中的场景应用
  2. mysql的单行注释_MySQL基础--会这些就够了
  3. 30. Leetcode 83. 删除排序链表中的重复元素 (链表-双指针)
  4. Flink从入门到精通100篇(二十二)-Apache Flink OLAP引擎性能优化及应用
  5. 一个高效且友好的TensorFlow图神经网络(GNN)框架:tf_geometric
  6. 深度学习100例-卷积神经网络(CNN)识别验证码 | 第12天
  7. 深度学习100例-卷积神经网络(CNN)花朵识别 | 第4天
  8. LeetCode题组:第1162题-地图分析
  9. GPU高效通信算法-Ring Allreduce
  10. 四张图揭秘中国AI人才现状