输入格式:
第一行输入需要凑的钱数 m 和硬币的种类 n (0<m<100,0<n<10),第二行输入 n 种硬币的具体币值,假设硬币供应量无限多。

输出格式:
输出最少需要的硬币个数

输入样例:
在这里给出一组输入。例如:

6 3
1 3 4
输出样例:
在这里给出相应的输出。例如:

2

代码实现:

package work5;

import java.util.Arrays;
import java.util.Scanner; /**
* @author Noble4
* maxValue[i][j]的意思是:拿的总金额为i,且正在拿面值为value[j](当前最大值)的钱币的最少拿钱数目
*/
public class test6 { public static void main(String[] args) {
int MAX_VALUE = 999;
Scanner sr = new Scanner(System.in);
//要凑的钱的总数
int c = sr.nextInt();
//钱的种类
int n = sr.nextInt();
//钱的价值
int[] value = new int[n];
for (int i = 0; i < n; i++) {
value[i] = sr.nextInt();
}
//对价值进行排序
Arrays.sort(value);
//构造最优解的网格
int[][] maxValue = new int[c+1][n];
for (int i = 0; i < c+1; i++) {
for (int j = 0; j < n; j++) {
maxValue[i][j] = MAX_VALUE;
}
}
// 填充网格
for (int i = 0; i <= c; i++) {
for (int j = 0; j < n; j++) {
if(i == 0) {
maxValue[i][j] = MAX_VALUE;
}else if(i<value[j]){//要凑钱数小于该种类钱面值时
if(j==0) {//如果这已经是最低面值的钱则表示此路不通
maxValue[i][j] = MAX_VALUE;
}else {//只能选择不拿
maxValue[i][j] = maxValue[i][j-1];
}
}else if(i%value[j] == 0) {//整除情况
maxValue[i][j] = i/value[j];
}else if(j == 0) {//如果这已经是最低面值且不能被整除则表示此路不通
maxValue[i][j] = MAX_VALUE;
}else {//可以选择拿该钱的情况
int item = (int) Math.floor(i/value[j]);
int result = MAX_VALUE;
for(int t = 0;t<=item;t++) {
int temp = maxValue[i-t*value[j]][j-1] + t;
if(temp<result) {
result = temp;
}
}
maxValue[i][j] = result;
}
}
} // 打印结果二维数组maxValue for (int i = 0; i < c+1; i++) { for (int j = 0; j < n; j++) {
System.out.printf("%6d", maxValue[i][j]); } System.out.println(); } System.out.println(maxValue[c][n-1]);
}
}

例程:

  

BTA结果

零钱问题的动态规划解法——用 n 种不同币值的硬币凑出 m 元,最少需要多少硬币。的更多相关文章

  1. leetcode-91-解码方法(动态规划和递归两种解法)

    题目描述: 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总数 ...

  2. 增强学习(三)----- MDP的动态规划解法

    上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...

  3. Leetcode题目322.零钱兑换(动态规划-中等)

    题目描述: 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 示例 1: 输入: c ...

  4. Trees in a Wood. UVA 10214 欧拉函数或者容斥定理 给定a,b求 |x|<=a, |y|<=b这个范围内的所有整点不包括原点都种一棵树。求出你站在原点向四周看到的树的数量/总的树的数量的值。

    /** 题目:Trees in a Wood. UVA 10214 链接:https://vjudge.net/problem/UVA-10214 题意:给定a,b求 |x|<=a, |y|&l ...

  5. PAT1048. Find Coins(01背包问题动态规划解法)

    问题描述: Eva loves to collect coins from all over the universe, including some other planets like Mars. ...

  6. java程序中抛出异常的两种方式,及异常抛出的顺序

    在java中,会经常遇到异常,java提供了两种抛出异常的方式. 方式一: throws ,抛出具体代码中的异常,这种方式编译器都会提示,举例: public static void main(Str ...

  7. 一只青蛙从第一级台阶跳到第n级,每次可以跳任意级,共有多少种跳法,并写出递推式

    是斐波那契数列问题 假设f(n)是n个台阶跳的次数:(假设已经调到第n个台阶,最后一次是由哪个台阶跳上来的) f(n) = f(n-1)+f(n-2)+...+f(n-(n-1)) + f(n-n) ...

  8. 23种设计模式 - 对象性能(Singleton - Flyweight享元)

    其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 对象性能 面向对象很好地解决了"抽象"的问题,但是必不可免地付出一定的代价.对于通常情 ...

  9. WPF 介绍一种在MVVM模式下弹出子窗体的方式

    主要是通过一个WindowManager管理类,在window后台代码中通过WindowManager注册需要弹出的窗体类型,在ViewModel通过WindowManager的Show方法,显示出来 ...

随机推荐

  1. 分库分表的 9种分布式主键ID 生成方案,挺全乎的

    <sharding-jdbc 分库分表的 4种分片策略> 中我们介绍了 sharding-jdbc 4种分片策略的使用场景,可以满足基础的分片功能开发,这篇我们来看看分库分表后,应该如何为 ...

  2. Vue的生命周期--代码片段

    Vue 实例有一个完整的生命周期,也就是从开始创建. 初始化数据. 编译模板. 挂载 Dom. 渲染→更新→渲染. 销毁等一系列过程,我们称这是 Vue 的生命周期.通俗说就是 Vue 实例从创建到销 ...

  3. 什么是4G模块 4G模块的工作原理及特点

    什么是4G模块 4G模块,也被叫做4G通信模块或4G DTU模块,他是物联网行业具有4G通信功能的一种产品,通过4G模块,我们可以实现工业设备数据通过无线4G网络传输到远端控制中心,并从控制中心通过4 ...

  4. linux_杂记 命令

    1. 查看centos版本号: lsb_release -a 2. 查看mysql服务是否开机启动: http://www.cnblogs.com/panjun-Donet/archive/2010/ ...

  5. K-近邻算法kNN

    K-近邻算法(k-Nearest Neighbor,简称kNN)采用测量不同特征值之间的距离方法进行分类,是一种常用的监督学习方法,其工作机制很简单:给定测试样本,基于某种距离亮度找出训练集中与其靠近 ...

  6. java版飞机大战代码

    @ 目录 前言 Plane PlaneStatus类 Power类 Gift Diji play类 over类 MainFrame主类 MyZiDan DijiZiDan Before 前言 很久之前 ...

  7. dm-crypt加密磁盘

    dm-cry加密方式密码与文件 与其它创建加密文件系统的方法相比,dm-crypt系统有着无可比拟的优越性:它的速度更快,易用性更强.除此之外,它的适用面也很广,能够运行在各种块设备上,即使这些设备使 ...

  8. python分类

    python是一种动态解释性的强类型语言. python下分几个类别,分别是cpython,jypython,ironpython,pypy等等,这些属于不同的解释器,但编写规范只有一个就是pytho ...

  9. css子选择器 :frist-child :nth-child(n) :nth-of-type(n) ::select选择器

    记录一下前一段时间使用.学习的几种选择器. 1. :frist-child 选择器n 比如<ul><li></li> <li></li> & ...

  10. [sql 注入] insert 报错注入与延时盲注

    insert注入的技巧在于如何在一个字段值内构造闭合. insert 报错注入 演示案例所用的表: MariaDB [mysql]> desc test; +--------+--------- ...