java动态规划算法——硬币找零问题实例分析

 更新时间:2020年05月26日 09:59:47   作者:Z_DZ  
这篇文章主要介绍了java动态规划算法——硬币找零问题,结合实例形式分析了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] );
 }
}

运行结果

金额        对应的最小硬币数
1        1
2        2
3        3
4        4
5        1
6        2
7        3
8        4
9        5
10        1
11        2
12        3
13        4
14        5
15        2
16        3
17        4
18        5
19        6
20        2
21        3
22        4
23        5
24        6
25        3
26        4
27        5
28        6
29        7
30        3
31        4
32        5
33        6
34        7
35        4
36        5
37        6
38        7
39        8
40        4
41        5
42        6
43        7
44        8
45        5
46        6
47        7
48        8
49        9
50        5
51        6
52        7
53        8
54        9
55        6
56        7
57        8
58        9
59        10
60        6
61        7
62        8
63        9

更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

相关文章

  • Spring中如何使用@Value注解实现给Bean属性赋值

    Spring中如何使用@Value注解实现给Bean属性赋值

    这篇文章主要介绍了Spring中如何使用@Value注解实现给Bean属性赋值的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java深入浅出理解快速排序以及优化方式

    Java深入浅出理解快速排序以及优化方式

    快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影
    2021-11-11
  • Java 动态代理与CGLIB详细介绍

    Java 动态代理与CGLIB详细介绍

    这篇文章主要介绍了 Java 动态代理与CGLIB详细介绍的相关资料,需要的朋友可以参考下
    2017-02-02
  • 浅谈Java设计模式系列-装饰器模式

    浅谈Java设计模式系列-装饰器模式

    这篇文章主要介绍了Java设计模式系列-装饰器模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 多个SpringBoot项目采用redis实现Session共享功能

    多个SpringBoot项目采用redis实现Session共享功能

    这篇文章主要介绍了多个SpringBoot项目采用redis实现Session共享,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • 使用Mybatis遇到的there is no getter异常

    使用Mybatis遇到的there is no getter异常

    这篇文章主要介绍了使用Mybatis遇到的there is no getter异常,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • Java比较器实现方法项目案例

    Java比较器实现方法项目案例

    这篇文章主要介绍了Java比较器实现方法,结合具体项目案例形式分析了Java比较器相关排序操作技巧,需要的朋友可以参考下
    2019-03-03
  • Idea创建多模块maven聚合项目的实现

    Idea创建多模块maven聚合项目的实现

    这篇文章主要介绍了Idea创建多模块maven聚合项目的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • java对象对比之comparable和comparator的区别

    java对象对比之comparable和comparator的区别

    今天给大家带来的是关于Java的相关知识,文章围绕着comparable和comparator的区别展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • MyBatis传入List集合查询数据问题

    MyBatis传入List集合查询数据问题

    这篇文章主要介绍了MyBatis传入List集合查询数据问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02

最新评论