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. Mac 安装实用开发软件和日常软件清单

    软件安装 开发需要安装软件 HomeBrew 这个是 mac 的软件包管理软件,类似于 yum 安装 rpm 包会帮我们处理软件包之间的依赖关系一样,或者 apt-get 安装 deb 包,最开始接触 ...

  2. Java调用支付宝支付遇到的坑

    下单成功,回调不成功 原因:支付宝公钥填成商户公钥.这两个公钥是不一样的,但开头和结尾很多字符都一样,如果不用文本比对器比对很难发现!而且支付宝公钥填成商户公钥还能下单成功,只是回调不成功,这让原因更 ...

  3. &#128075;嗨,你有一份微信好友报告待查收~

    全部代码都已上传至我的KLab-

  4. 手把手numpy教程【二】——数组与切片

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Numpy专题的第二篇,我们来进入正题,来看看Numpy的运算. 上一篇文章当中曾经提到过,同样大小的数据,使用Numpy的运算速度会 ...

  5. HTML5新特性--svg-echarts(重点)-拖动API-WebWorker

    一.html5新特性--svg--(折线/渐变特效对象/滤镜) #折线:多个坐标点组件一条折线 <polyline points="50,50 70,55 60,66 " s ...

  6. scrapy中间件之下载中间件使用(网易新闻爬取)

    scrapy项目中的middlewarse.py中间件 爬虫中间件:目前先不介绍 下载中间件(需要在settings.py中开启) (1)请求处理函数:process_request(self, re ...

  7. 10.1Go Mysql

    第十章 Go Mysql 准备好mysql数据库服务端数据. 创建test数据库 MariaDB [(none)]> create database test; Query OK, 1 row ...

  8. java 精确加减

    /** * 提供精确的加法运算. * @param v1 被加数 * @param v2 加数 * @return 两个参数的和 */ public double add(double v1, dou ...

  9. LightOJ1220

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1220 题目大意: 给你一个 x,请求出一个最大的 p 使得 np = x(n为 ...

  10. LightOJ1336

    题目大意: 给你一个 n ,求出 1 到 n 中有多少个数的因数和为偶数. 解题思路: 可以先求出因数和为奇数的数字的个数. 由算术基本定理我们可以得到:N=P1a1P2a2P3a3 … Pnan, ...