输入格式:
第一行输入需要凑的钱数 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. Jumpserver简介,部署使用

    Jumpserver简介 Jumpserver 是一款使用 Python, Django 开发的开源跳板机系统, 为亏联网企业提供了认证,授权,审计,自动化运维等功能,基于ssh协议来管理,客户端无需 ...

  2. R语言删除不规范的值(或NA)

    在使用R语言处理表格时(xlsx, csv),有时里面含有缺失值,或者不规范的数值,比如下图有许多的问号"?",为了便于处理数据,这些都应该整行地删掉. 为了删掉那些包含" ...

  3. Unity正交相机智能包围物体(组)方案

    Unity正交相机智能包围物体(组)方案 目录 Unity正交相机智能包围物体(组)方案 一.技术背景 二.相关概念 2.1 正交摄像机 2.2 正交相机的Size 2.3 相机的Aspect 2.4 ...

  4. 在pgsql库用触发器自动触发PostgreSQL的存储过程,实现插入。

    需求:在对表A 执行 insert操作时,筛选符合条件的数据 insert到表B中,编写为存储过程(postgreSQL数据库) [筛选条件]:1. dd !="A" 或是 dd为 ...

  5. Aps.Net Core3.1 WebApi发送阿里云短信验证码

    1.前言 转眼又要过了一年了 好久没写博客了,人不学就要落后,今天有时间把以前弄的发送阿里云短信验证码登录记录一下. 2.准备条件 1)去阿里云官网注册一个账号.有账号直接登录就行,以前新人好像有免费 ...

  6. 如何让Visual Studio 2019更好用(VS2019配置指南)

    今天电脑没带,借用外面的电脑配环境来用.刚下载完的VS是这样的: UI挺好看的,但代码窗口看起来就和上个世纪的VC6没什么区别,快捷键用起来也不顺手.(2333) 接下来,我们将一步步优化编写环境,让 ...

  7. 对“线上问题 不能gdb调试怎么处理??“”的思考

    Q1:线上问题的process 都为release版本!不带调试信息怎么查?(目前有时需要查线上问题, 不得不解决这个问题) 之前查问题都是编译环境编译一个带有debug信息的版本进行替换来调试,但是 ...

  8. gcc 去除无用程序段

    嵌入式系统中,对程序尺寸要求高时,可以使用本方法 代码中,经常会有一种情况,库中并非所有函数都会用到.然而,无用的函数也最终被编译进可执行文件中了. 为避免这一情况,可以在编译时,添加选项:-ffun ...

  9. Innodb之线程独享内存

    引用链接: https://blog.csdn.net/miyatang/article/details/54881547 https://blog.csdn.net/wyzxg/article/de ...

  10. MFC的消息响应机制说明

    MFC的快速理解: 1.MFC的设计者们在设计MFC时,有一个主要的方向就是尽可能使得MFC的代码要小,速度尽可能快.为了这个方向,工程师们使用了许多技巧,主要表现在宏的运用上,实 现MFC的消息映射 ...