1 问题描述

现需找零金额为n,则最少需要用多少面值为d1 < d2 < d3 < … < dm的硬币?(PS:假设这m种面值d1 < d2 < d3 < … < dm的硬币,其中d1 = 1,且每种硬币数量无限可得)

2 解决方案

2.1 动态规划法


本文编码思想参考自《算法设计与分析基础》第三版,具体讲解如下:

package com.liuzhen.chapter8;

public class ChangeMaking {

    public void getChangeMakingN(int[] coinType,int n){
int[] minNumber = new int[n+1]; //初始化后,所有元素均为0,其中minNumber[0] = 0,表示无须找零
int[] tempMinJ = new int[n+1]; //tempMinJ[0]在此处无含义
for(int i = 1;i <= n;i++){
int j = 0;
int tempJ = -1; //用于h获取minNumber[i]最小值中当前新使用的硬币面值数组下标
int temp = Integer.MAX_VALUE; //计算当前minNumber[i]最小值,初始化int类型最大值
while(j < coinType.length && i >= coinType[j]){
if(minNumber[i-coinType[j]] + 1 < temp){
temp = minNumber[i-coinType[j]] + 1;
tempJ = j;
}
j++;
}
minNumber[i] = temp;
tempMinJ[i] = tempJ;
} System.out.println("给定硬币面值种类依次为:");
for(int i = 0;i < coinType.length;i++)
System.out.print(coinType[i]+" "); System.out.println("\n找零大小从1到"+n+"的最少硬币组合数目为:");
for(int i = 1;i < minNumber.length;i++)
System.out.print(minNumber[i]+" "); System.out.println("\n对应找零大小从1到"+n+"新增的硬币数组下标为:");
for(int i = 1;i < tempMinJ.length;i++)
System.out.print(tempMinJ[i]+" "); System.out.println("\n对应找零大小从1到"+n+"新增的硬币数组下标对应的硬币面值为:");
for(int i = 1;i < tempMinJ.length;i++)
System.out.print(coinType[tempMinJ[i]]+" "); System.out.println("\n\n找零大小为"+n+"的硬币组合最少数目为:"+minNumber[minNumber.length-1]);
System.out.print("找零大小为"+n+"的硬币组合最少数目对应的硬币面值依次为:");
int needN = n;
int minJ = tempMinJ.length-1;
while(needN > 0){
System.out.print(coinType[tempMinJ[minJ]]+" ");
needN = needN - coinType[tempMinJ[minJ]];
minJ = needN;
}
} public static void main(String[] args){
ChangeMaking test = new ChangeMaking();
int[] coinType = {1,3,4};
test.getChangeMakingN(coinType, 6);
}
}

运行结果:

给定硬币面值种类依次为:
1 3 4
找零大小从1到6的最少硬币组合数目为:
1 2 1 1 2 2
对应找零大小从1到6新增的硬币数组下标为:
0 0 1 2 0 1
对应找零大小从1到6新增的硬币数组下标对应的硬币面值为:
1 1 3 4 1 3 找零大小为6的硬币组合最少数目为:2
找零大小为6的硬币组合最少数目对应的硬币面值依次为:3 3

Java实现找零问题的更多相关文章

  1. 算法笔记_048:找零问题(Java)

    目录 1 问题描述 2 解决方案 2.1 动态规划法   1 问题描述 现需找零金额为n,则最少需要用多少面值为d1 < d2 < d3 < ... < dm的硬币?(PS:假 ...

  2. [LeetCode] Coin Change 硬币找零

    You are given coins of different denominations and a total amount of money amount. Write a function ...

  3. LeetCode:柠檬水找零【860】

    LeetCode:柠檬水找零[860] 题目描述 在柠檬水摊上,每一杯柠檬水的售价为 5 美元. 顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯. 每位顾客只买一杯柠檬水,然后向 ...

  4. [LeetCode] 322. Coin Change 硬币找零

    You are given coins of different denominations and a total amount of money amount. Write a function ...

  5. [LeetCode] 518. Coin Change 2 硬币找零 2

    You are given coins of different denominations and a total amount of money. Write a function to comp ...

  6. LeetCode.860-卖柠檬水找零(Lemonade Change)

    这是悦乐书的第331次更新,第355篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第201题(顺位题号是860).在柠檬水摊上,每杯柠檬水的价格为5美元.客户站在队列中向 ...

  7. NYOJ995硬币找零(简单dp)

    /* 题意:给你不同面额的硬币(每种硬币无限多),需要找零的面值是T,用这些硬币进行找零, 如果T恰好能被找零,输出最少需要的硬币的数目!否则请输出剩下钱数最少的找零方案中的最少硬币数! 思路:转换成 ...

  8. HDU3591找零,背包

    题目大概的意思就是:小强用硬币买东西,硬币有N种,面值为Vi,店家有各种硬币都有无限个,而小强只有Ci个(分别对应Vi) 问最小交易硬币数,就是一个有找零的背包问题啦. 我的上一篇博客跟这hdu359 ...

  9. 【ACM小白成长撸】--贪婪法解硬币找零问题

    question:假设有一种货币,它有面值为1分.2分.5分和1角的硬币,最少需要多少个硬币来找出K分钱的零钱.按照贪婪法的思想,需要不断地使用面值最大的硬币.如果找零的值小于最大的硬币值,则尝试第二 ...

随机推荐

  1. flink流处理从0到1

    一.DataStream API之Data Sources(消费者之数据源) 介绍: source是程序的数据源输入,你可以通过StreamExecutionEnvironment.addSource ...

  2. CSS解决border影响元素宽高的问题(box-sizing属性)

    修改 box-sizing 属性.将 box-sizing 设置为 border-box 即可.

  3. 黑马程序员_毕向东_Java基础视频教程——类型转换(随笔)

    类型转换 class Test{ public static void main(String[] args) { byte b = 3; // b = b + 2; /* Test.java:5: ...

  4. spring源码解析之前置知识点

    本文是作者原创,版权归作者所有.若要转载,请注明出处. 最近在看spring源码,但是spring的体系太庞大了,在这里记录一下阅读源码中遇到知识点 @PostConstruct 被注解的方法,在对象 ...

  5. zsy后台管理系统-架构设计

    Zsy框架总体架构设计 1.Mysql数据库,存储所有表的数据. 2.Zsy-基础项目(Zsy-Model,Zsy-Dao,Zsy-Service,Zsy-Web),基于SSM框架.项目功能包含基本的 ...

  6. python3.x 基础五:模块

    1.定义 模块:本质是.py结尾的python文件,从逻辑上组织python代码,可以是变量,函数,类,逻辑,目的是实现一个功能,test.py 对应模块名:test 包:从逻辑上组织模块的,本质就是 ...

  7. 王艳 201771010127《面向对象程序设计(java)》第二周学习总结

     王艳 201771010127<面向对象程序设计(java)>第二周学习总结 第一部分:理论知识学习部分 3.1:基本概念. 1)标识符:标识符由字母.数字.美元符号以及下划线组成.且第 ...

  8. Spring 自动装配 byName

    自动装配 byName,这种模式由属性名称(方法名)指定自动装配.Spring 容器看作 beans,在 XML 配置文件中 beans 的 auto-wire 属性设置为 byName.然后,它尝试 ...

  9. MYSQL(1)— 初识MySQL

    一.MySQL [官网文档]https://dev.mysql.com/doc/refman/8.0/en/ 1-1.Mysql是一个关系型数据库,里面的表数据是可以有联系的,例如多对一,一对多. 1 ...

  10. SpringBoot2.x【一】从零开始环境搭建

    SpringBoot2.x[一]从零开始环境搭建 对于之前的Spring框架的使用,各种配置文件XML.properties一旦出错之后错误难寻,这也是为什么SpringBoot被推上主流的原因,Sp ...