输入格式:
第一行输入需要凑的钱数 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. SSM实现文件上传

    1.导入上传需要的jar包 commons-fileupload-1.3.3.jar commons-io-2.6.jar 2.创建 index.jsp <%@ page contentType ...

  2. MySQL 使用规范总结

    MySQL已经成为世界上最受欢迎的数据库管理系统之一,无论是用在小型开发项目上,还是用在构建那较大型的网站,MySQL都用实力证明了自己是一个稳定.可靠.快速.可信的系统,足以胜任任何数据存储业务的需 ...

  3. 容器场景要选择什么 Linux 版本?

    容器的底层实现深度依赖于内核的众多特性,如 overlay 文件系统,namespace, cgroup 等,因此内核的功能和稳定性,在很大程度上,决定了整个容器PaaS平台的功能和稳定性.从 TKE ...

  4. 论文解读 - MaskGAN:BETTER TEXT GENERATION VIA FILLING IN THE _____

    1 简介 文本生成是自然语言处理中一个重要的研究领域,具有广阔的应用前景.当前主流的用来进行文本生成的模型主要是Seq2Seq模型,通常利用maximum likelihood和teacher for ...

  5. [.Net Core 3.0+/.Net 5] System.Text.Json中时间格式化

    简介 .Net Core 3.0开始全新推出了一个名为System.Text.Json的Json解析库,用于序列化和反序列化Json,此库的设计是为了取代Json.Net(Newtonsoft.Jso ...

  6. WSL-Ubuntu18.04 磁盘迁移 与 ns3-gym 安装

    WSL 安装 win10 版本应大于或等于 1903 win10 设置页面 输入 控制面板 并点击进入 找到 程序和功能 并打开 找到 启动或关闭 Windows 功能 并打开 向下拉 勾选 适用于L ...

  7. C语言I博客作业3

    这个作业属于哪个课程 <https://edu.cnblogs.com/campus/zswxy/SE2020-1 > 这个作业要求在哪里 https://edu.cnblogs.com/ ...

  8. JAVA中常见的阻塞队列详解

    在之前的线程池的介绍中我们看到了很多阻塞队列,这篇文章我们主要来说说阻塞队列的事. 阻塞队列也就是 BlockingQueue ,这个类是一个接 口,同时继承了 Queue 接口,这两个接口都是在JD ...

  9. [MIT6.006] 8. Hashing with Chaining 散列表

    一.字典 在之前课里,如果我们要实现插入,删除和查找,使用树结构,最好的时间复杂度是AVL下的Ο(log2n),使用线性结构,最好的复杂度为基数排序Ο(n).但如果使用字典数据类型去做,时间复杂度可为 ...

  10. Flink处理函数实战之一:深入了解ProcessFunction的状态(Flink-1.10)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...