java动态规划算法——硬币找零问题实例分析
本文实例讲述了java动态规划算法——硬币找零问题。分享给大家供大家参考,具体如下:
问题描述
现在有3种硬币分别为:1元,5元,10元,现在给你63元,让你全部换成硬币,求出最小硬币数量,也就是说,怎么用最少的硬币数凑成63元。
分析问题
解决这个问题,我们可以将这个大问题分成若干个小问题,自下而上解决问题。
1元对应的最小硬币数是1
2元对应的最小硬币数是2
3元对应的最小硬币数是3
4元对应的最小硬币数是4
……
63元对应的最小硬币数是XXX
假设我们将前边计算出的金额对应的最小硬币数像备忘录一样记录下来,那么后边金额对应的最小硬币数的就好说了,为什么?
举例:假设你要求63的最小硬币数,那么你需要这样计算:63-1=62、63-5=58、63-10=53。假设62、58、53对应的最小硬币数已经被你记录在了备忘录数组。这时候你只需要找出62、58、53中谁对应的最小硬币数最小,然后加1,就是63对应的最小硬币数。因为63比62、58、53都大,最好的情况无非就是在62、58、53中找出最小的一种情况加1,这就是最优解!
按照这种备忘录思想,我们进行编程。首先将我们要处理的数据转换成数组和必要参数。
int[] coins = { 1 , 5 , 10 }; //硬币面额数组int adm = 63; //要求的金额int[] money = new int[63+1]; //金额数组,也就是备忘录数组
说明:money数组就是备忘录数组,例如:money[0]对应0,money[1]对应1,money[2]对应2……
接下来,将我们上边的解题思路抽象成函数,函数中无非就是:循环,判断,赋值……如何利用这些逻辑语句,将我们的思路描述出来,这是最难的,因为要做到滴水不漏,情况都要考虑周全,一步错结果就错,这需要长久锻炼抽象逻辑思维。我比较习惯的方式是边看代码,边关联结题思路,然后模仿,代码中有注释,大家边看边分析吧:
public static void main(String[] args) { int[] coins = {1,5,10}; int money = 63; changeMoney(coins,money);} /** * 硬币找零算法,备忘录方法 * @param coins 硬币面额数组 * @param money 目标金额 */public static void changeMoney( int[] coins , int money ) { //备忘录数组,一一对应 int[] memo = new int[money + 1]; //0元对应的最小硬币数是0 memo[0] = 0; System.out.println( '金额t' + '对应的最小硬币数' ); //遍历备忘录数组,为每个金额记录他的最小硬币数,我们从1元开始 for( int currentMoney = 1 ; currentMoney <= money ; currentMoney++ ) { //默认最小硬币数就是当前金额的本身 //举例:63元最多就是63个1元的硬币呗 int minCoins = currentMoney; //遍历硬币面额数组,找到前边所能找到的最小硬币数加1 for( int coinKind = 0 ; coinKind < coins.length ; coinKind++ ) { //只有当前金额大于等于某个硬币面额的时候才可以用这种方法 //举例:5-1=4,5-5=0,5-10=-5,我们没有-5元好吧…… if( currentMoney >= coins[coinKind] ) { //我们在备忘录中查找之前的金额对应的最小硬币数 //如果能查到就在它的基础上加1 int tempCoins = memo[currentMoney - coins[coinKind]] + 1; //找到几种情况中最小的硬币数 //举例:63元 tempConis //可以是memo[63-1]+1、memo[63-5]+1、memo[63-10]+1 //我们要找到最小的 if( tempCoins < minCoins ) { minCoins = tempCoins; } } } //找到当前金额对应的最小硬币数,我们将它记录在备忘录中 memo[currentMoney] = minCoins; System.out.println( currentMoney + 't' + memo[currentMoney] ); }}
运行结果
金额对应的最小硬币数1122334451627384951011121231341451521631741851962022132242352462532642752862973033143253363473543653763873984044154264374484554664774884995055165275385495565675785895910606617628639
更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
相关文章:
1. 在windows下安装docker Toolbox 启动Docker Quickstart Terminal 失败!2. font-family - 我引入CSS3自定义字体没有效果?3. docker images显示的镜像过多,狗眼被亮瞎了,怎么办?4. macos - mac下docker如何设置代理5. dockerfile - [docker build image失败- npm install]6. objective-c - iOS开发支付宝和微信支付完成为什么跳转到了之前开发的一个app?7. PHP中的$this代表当前的类还是方法?8. angular.js - 求一款angular插件9. java - 我用Tomcat访问SQL server数据库时,出现以下错误,该怎么解决?10. docker start -a dockername 老是卡住,什么情况?