零钱问题的动态规划解法——用 n 种不同币值的硬币凑出 m 元,最少需要多少硬币。
输入格式:
第一行输入需要凑的钱数 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 元,最少需要多少硬币。的更多相关文章
- leetcode-91-解码方法(动态规划和递归两种解法)
题目描述: 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总数 ...
- 增强学习(三)----- MDP的动态规划解法
上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...
- Leetcode题目322.零钱兑换(动态规划-中等)
题目描述: 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 示例 1: 输入: c ...
- 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 ...
- PAT1048. Find Coins(01背包问题动态规划解法)
问题描述: Eva loves to collect coins from all over the universe, including some other planets like Mars. ...
- java程序中抛出异常的两种方式,及异常抛出的顺序
在java中,会经常遇到异常,java提供了两种抛出异常的方式. 方式一: throws ,抛出具体代码中的异常,这种方式编译器都会提示,举例: public static void main(Str ...
- 一只青蛙从第一级台阶跳到第n级,每次可以跳任意级,共有多少种跳法,并写出递推式
是斐波那契数列问题 假设f(n)是n个台阶跳的次数:(假设已经调到第n个台阶,最后一次是由哪个台阶跳上来的) f(n) = f(n-1)+f(n-2)+...+f(n-(n-1)) + f(n-n) ...
- 23种设计模式 - 对象性能(Singleton - Flyweight享元)
其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 对象性能 面向对象很好地解决了"抽象"的问题,但是必不可免地付出一定的代价.对于通常情 ...
- WPF 介绍一种在MVVM模式下弹出子窗体的方式
主要是通过一个WindowManager管理类,在window后台代码中通过WindowManager注册需要弹出的窗体类型,在ViewModel通过WindowManager的Show方法,显示出来 ...
随机推荐
- Docker(5)- docker version 命令详解
如果你还想从头学起 Docker,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1870863.html 作用 显示 Docker 版本信 ...
- Android 视频播放器 NurVideoPlayer ()
我在实战项目中用了它. 更新了2.x.x版本ijkplayer的封装 支持屏幕滑动--滑动时间,亮度,声音,进度,支持全屏-单屏,双击暂停--继续,锁定屏幕,支持HTTP和https,也可以控制声道( ...
- 【SpringBoot】10.SpringBoot文件上传
SpringBoot整合Thymeleaf 1.创建Thymeleaf的入门项目 maven构建简单项目 修改pom文件添加thymeleaf的坐标 <!-- thymeleaf的坐标 --&g ...
- ci框架根据配置自动生成controller控制器和model控制器(改版本)
CI修改如下: if($modle_file=config_item('modle_file')) { if ($modle_file === TRUE) { $modle_file=config_i ...
- leetcode116:search-for-a-range
题目描述 给出一个有序数组,请在数组中找出目标值的起始位置和结束位置 你的算法的时间复杂度应该在O(log n)之内 如果数组中不存在目标,返回[-1, -1]. 例如: 给出的数组是[5, 7, 7 ...
- Serilog 源码解析——数据的保存(上)
在上一篇中,我们主要研究了Serilog是如何解析字符串模板的,它只是单独对字符串模板的处理,对于日志记录时所附带的数据没有做任何的操作.在本篇中,我们着重研究日志数据的存储方式.(系列目录) 本篇所 ...
- CSS两列布局的多种方式
两列布局(一侧固定宽度,一侧自适应),在工作中应该是经常使用到,可以说是前端基础了.这种两列布局的样式是我们在平时工作中非常常见的设计,同时也是面试中要求实现的高频题.很有必要掌握以备不时之需.这里总 ...
- 云原生haproxy 代理-ebpf
在如下网络层面下,代理(比如Envoy nginx )执行额外的L7策略(Health checks, service discovery, load balancing, mutual TLS),其 ...
- 守护进程详解以及start-stop-daemon命令
1.概念:守护进程是在后台运行的不受终端控制的进程,通常守护进程在系统启动时自动运行,守护进程的名称通常以d结尾,比如sshd.xinetd.crond等. 2.创建守护进程的步骤:a.调用fork( ...
- t分布与t检验的一点理解
最近又遇到了t分布及t检验方面的内容,发现有些地方自己当初没有很明白,就又查了些资料,加深了一下自己的理解,这里也将自己的一些理解记录下来. 1. 理论基础--大数定理与中心极限定理 在 ...