动态规划-最少硬币问题
问题描述:设有n种不同面值的硬币,各硬币的面值存在于数组T[1:n]中。现要用这些面值的硬币来找钱。可以使用的各种面值的硬币个数存于数组Coins[1:n]中。对任意钱数0≤m≤20001,设计一个最少硬币找钱m的方法。
算法设计:对于给定的1≤n≤10 ,硬币面值数组T和可以使用的各种面值的硬币数组Coins,以及钱数m, 0≤m≤20001,计算找钱m的最少硬币数。
数据输入:由文件input. Txt提供输入数据,文件的第1行中只有一个整数给出n的值,第2行起每行两个数,分别是T[j]和Coins[j]。最后一行是要找的钱数m。
结果输出:将计算出的最少硬币数输出到文件output.txt。问题无解时输出-1。
输入文件示例input.txt:
3
1 3
2 3
5 3
18
输出文件示例output.txt:
5
关注点:
1.多重背包 (每个物品有固定次数上限)
2.求的是最少
3.背包不能有空
代码:
1 #include<stdio.h> 2 #include<stdlib.h> 3 int maxint=2147483647; 4 void getit(int* t,int* coin,int ncoin,int money,int **m) 5 { 6 m[ncoin][0]=0; 7 for(int i=1;i<=money;i++) 8 { 9 m[ncoin][i]=maxint; 10 for(int j=1;j<=coin[ncoin];j++) 11 if(i==t[ncoin]*j) 12 { 13 m[ncoin][i]=j; 14 break; 15 } 16 } 17 18 for(int i=ncoin-1;i>=0;i--) 19 { //复制一遍 20 for(int j=0;j<=money;j++) 21 m[i][j]=m[i+1][j]; 22 //修改到最佳 23 for(int j=money;j>=t[i];j--)//从后往前做 /*好处:不用考虑前面已经用了该面值的硬币多少个。m数组记录的不是单一面值硬币用到的个数,而是所有面值硬币用到的总个数 坏处:循环次数多了*/ 24 for(int k=1;k<=coin[i];k++) 25 if((j-t[i]*k>=0)&&(m[i][j-t[i]*k]!=maxint)&&(m[i][j-t[i]*k]+k<m[i][j])) 26 m[i][j]=m[i][j-t[i]*k]+k; 27 } 28 if(m[0][money]==maxint)printf("-1"); 29 else printf("%d\n",m[0][money]); 30 31 } 32 33 int main() 34 { 35 //输入 int ncoin; 36 scanf("%d",&ncoin); 37 int* t=(int *)malloc(sizeof(int)*ncoin); 38 int* coin=(int *)malloc(sizeof(int)*ncoin); 39 for(int i=0;i<ncoin;i++) 40 scanf("%d %d",&t[i],&coin[i]); 41 int money; 42 scanf("%d",&money); //准备 43 int** m=(int **)malloc(sizeof(int *)*ncoin); 44 for(int i=0;i<ncoin;i++) 45 m[i]=(int *)malloc(sizeof(int)*(money+1)); 46 int** num=(int **)malloc(sizeof(int *)*ncoin); 47 for(int i=0;i<ncoin;i++) 48 num[i]=(int *)malloc(sizeof(int)*(money+1)); //执行 49 getit(t,coin,ncoin-1,money,m); //打印过程 50 for(int i=0;i<ncoin;i++) 51 { 52 for(int j=0;j<=money;j++) 53 printf("%d ",m[i][j]); 54 printf("\n"); 55 } 56 return 0; 57 }
转载于:https://www.cnblogs.com/kk980414/p/9786757.html
动态规划-最少硬币问题相关推荐
- java动态规划凑硬币问题,详解动态规划最少硬币找零问题--JavaScript实现
硬币找零问题是动态规划的一个经典问题,其中最少硬币找零是一个变种,本篇将参照上一篇01背包问题的解题思路,来详细讲解一下最少硬币找零问题.如果你需要查看上一篇,可以点击下面链接: 详解动态规划01背包 ...
- 最值动态规划——最少硬币组合
#include<iostream> #include<cstdio> #include<cstring> //本来想用 memset 函数来着,后来除了岔子!除了 ...
- 动态规划-最少硬币组合问题(Java)
问题: 如果我们有面值为1元.3元和5元的硬币若干枚,如何用最少的硬币凑够11元? 思路 代码 package java_20201010; import java.util.Scanner; /** ...
- 动态规划——最少硬币找零问题(python)
1. 问题描述 2. 思路 刚开始是想利用贪心算法.假如要找的零钱总额为49元,先找10块的,可以找40块,再继续找5块的,可以找5块,再继续找2块的,可以找4块.找够49元的最少纸币数为4 + 1 ...
- python 最小硬币数_Python之动态规划(最少硬币数找零)
完整代码: # 动态规划最少硬币数找零 def dpMakeChange(coinValueList, change, minCoins, coinsUsed): for cents in range ...
- 动态规划(三)——最少硬币和所有硬币问题
硬币问题 一.最少硬币问题 二.打印最少硬币组合 三.所有硬币组合 3.1硬币数量不限制 3.2硬币数量限制 一.最少硬币问题 有n种硬币,面值为v1-vn,数量无限,选用硬币,使其和金额为s,要求求 ...
- 动态规划求解最少硬币是多少?
多少枚硬币组合问题,最少硬币是多少? 1 确定状态 最后一步(最优策略中使用的最后一枚硬币) 化成子问题(最少的硬币拼出更小面值) 2 转移方程 3 初始条件和边界情况 f[0]=0,如果不能拼出Y, ...
- 16.1 动态规划引入例子:最少硬币问题
文章目录 最少硬币问题描述 解题思路 (1) 只使用最小面值的 1 分硬币 (2)在使用面值1分硬币的基础上,增加使用第二大面值的5分硬币 (3)继续处理其它面值的硬币 参考代码 打印最少硬币的组合 ...
- 动态规划经典题目-找零钱的最少硬币数
文章目录 一.题目描述 二.解题思路(朴素版本) 1. 定义状态 2. 定义状态转移方程 3. 初始化 三.代码实现 四.优化 五.执行结果 一.题目描述 美国的硬币按照面值1, 5, 10, 2 ...
- 硬币组合问题python_动态规划之硬币组合问题
问题:如果我们有面值为1元.3元和5元的硬币若干枚,如何用最少的硬币凑够11元? 动态规划的本质是将原问题分解为同性质的若干相同子结构,在求解最优值的过程中将子结构的最优值记录到一个表中以避免有时会有 ...
最新文章
- opengl android 线宽
- redis性能吞吐量瓶颈_面试官:如何用慢查询找到 Redis 的性能瓶颈?
- 《时间管理:如何充分利用你的24小时》—让你时间发挥最大效用
- 【嵌入式】ARM技术博客汇总
- 为什么c语言要定义变量,C语言为什么要规定对所用到的变量要“先定义,后使用”...
- 介绍一个非常好用的文件服务器 - HFS
- CSS样式重叠,前端显示的效果
- 使用Java语言开发微信公众平台(五)——获取access_token
- Java解决找不到主类或者无法加载主类
- java调c 申请内存_JAVA简单调用C/C++语言(JNI学习三)
- 深源恒际上线二代个人信用报告OCR识别服务
- 读一本自己心爱的书,冒什么风险都是值得的
- Python数据处理041:数据分析之时间序列
- 【精选】VI手册设计模板合集,附带源文件、预览图、精细分类
- 翁恺老师c语言课程笔记
- RabbitMQ服务启动就自动停止解决方案
- 山东畜牧兽医职业学院计算机考试,山东畜牧兽医职业学院计算机自编word15套试题11Word模拟试题(1-15)...
- 爱看网的内存占用情况
- 独家专栏 | 为什么国外的无人驾驶原型车,都选择混动车型?
- mysql 密码修改
热门文章
- 系统学习NLP(二十三)--浅谈Attention机制的理解
- memmove、memcpy和memccpy简介
- Linux系统怎么吸引用户,Linux下如何增加一个系统用户
- mysql丢数据无法启动mysql_mysql InnoDB数据无法启动解决办法
- MySQL 基数的定义
- Required field ‘client_protocol‘ is unset!
- 如何优雅的show出你的代码?
- std::locale与boost::locale的学习
- 浏览器与node事件循环
- 翻译连载 | 附录 C:函数式编程函数库-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇...