目录

1 问题描述

2 解决方案

2.1 动态规划法

 


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

参考资料:

1.算法设计与分析基础(第3版)  Anany Levitin 著 潘彦 译

算法笔记_048:找零问题(Java)的更多相关文章

  1. dp算法之硬币找零问题

    题目:硬币找零 题目介绍:现在有面值1.3.5元三种硬币无限个,问组成n元的硬币的最小数目? 分析:现在假设n=10,画出状态分布图: 硬币编号 硬币面值p 1 1 2 3 3 5 编号i/n总数j ...

  2. 算法笔记_023:拓扑排序(Java)

    目录 1 问题描述 2 解决方案 2.1 基于减治法实现 2.2 基于深度优先查找实现 1 问题描述 给定一个有向图,求取此图的拓扑排序序列. 那么,何为拓扑排序? 定义:将有向图中的顶点以线性方式进 ...

  3. 算法笔记_228:信用卡号校验(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证 ...

  4. 算法笔记_138:稳定婚姻问题(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 何为稳定婚姻问题? 有一个男士的集合Y = {m1,m2,m3...,mn}和一个女士的计划X = {n1,n2,n3,...,nn}.每一个男士有 ...

  5. 算法笔记_137:二分图的最大匹配(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 何为二分图的最大匹配问题? 引用自百度百科: 首先得说明一下何为匹配: 给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于 ...

  6. 算法笔记_132:最大流量问题(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 何为最大流量问题? 给定一个有向图,并为每一个顶点设定编号为0~n,现在求取从顶点0(PS:也可以称为源点)到顶点n(PS:也可以称为汇点)后,顶点 ...

  7. 算法笔记_040:二进制幂(Java)

    目录 1 问题描述 2 解决方案 2.1 从左至右二进制幂 2.2 从右至左二进制幂   1 问题描述 使用n的二进制表示,计算a的n次方. 2 解决方案 2.1 从左至右二进制幂 此方法计算a的n次 ...

  8. 算法笔记_014:合并排序(Java)

    1 问题描述 给定一组数据,使用合并排序得到这组数据的非降序排列. 2 解决方案 2.1 合并排序原理简介 引用自百度百科: 合并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Div ...

  9. 算法笔记_233:二阶魔方旋转(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 魔方可以对它的6个面自由旋转. 我们来操作一个2阶魔方(如图1所示): 为了描述方便,我们为它建立了坐标系. 各个面的初始状态如下:x轴正向:绿x轴 ...

随机推荐

  1. 并发系列4-大白话聊聊Java并发面试问题之公平锁与非公平锁是啥?【石杉的架构笔记】

  2. [Atcoder 080] A~D Tutorial

    很好奇这周为什么只有Beginner Contest而没有Regular Contest,本来想着去30minAK的,结果1个小时了还有一道题调不出来o(╯□╰)o A:Parking 让我体验了下开 ...

  3. 【树状数组逆序对】USACO.2011JAN-Above the median

    [题意] 给出一串数字,问中位数大于等于X的连续子串有几个.(这里如果有偶数个数,定义为偏大的那一个而非中间取平均) [思路] 下面的数据规模也小于原题,所以要改成__int64才行.没找到测试数据, ...

  4. Codeforces Round #127 (Div. 1) B. Guess That Car! 扫描线

    B. Guess That Car! 题目连接: http://codeforces.com/contest/201/problem/B Description A widely known amon ...

  5. GitHub 给已存在的仓库增加开原协议LICENSE

    如果你创建仓库时没有设置开原协议LICENSE,后续可以按下面方法增加开原协议LICENSE. 1.点击Create new file,如下图 2.文件名填LICENSE.md,右边就会出现choos ...

  6. HMAC的JAVA实现和应用

    1.简介: HMACSHA1 是从SHA1 哈希函数构造的一种键控哈希算法,被用作 HMAC(基于哈希的消息验证代码). 此 HMAC 进程将密钥与消息数据混合,使用哈希函数对混合结果进行哈希计算,将 ...

  7. GNU Debugger for Windows----GDB

            This web page provides 32-bit and 64-bit binaries of gdb for Windows for download. Equation ...

  8. Learning Note: SQL Server VS Oracle–Database architecture

     http://www.sqlpanda.com/2013/07/learning-note-sql-server-vs.html This is my learning note base on t ...

  9. 猫、路由器、交换机和PC

    转载:http://duanzw102.blog.163.com/blog/static/161838173201392431722650/ 猫是 modem,是有网络供应商,比如电信公司提供的拨号工 ...

  10. __FILE__,__LINE__,FUNCTION__实现代码跟踪调试

    转:http://www.cnitblog.com/zouzheng/archive/2007/08/31/32691.aspx 先看下简单的初始代码:注意其编译运行后的结果. root@xuanfe ...