nyist 硬币找零(完全背包)
2016-04-29 17:25
162 查看
硬币找零
时间限制:1000 ms | 内存限制:65535 KB难度:3
描述
在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从银行拿回最少的硬币数,并保证能用这些硬币发工资。
我们应该注意到,人民币的硬币系统是 100,50,20,10,5,2,1,0.5,0.2,0.1,0.05,
0.02,0.01 元,采用这些硬币我们可以对任何一个工资数用贪心算法求出其最少硬币数。
但不幸的是: 我们可能没有这样一种好的硬币系统, 因此用贪心算法不能求出最少的硬币数,甚至有些金钱总数还不能用这些硬币找零。例如,如果硬币系统是 40,30,25 元,那么 37元就不能用这些硬币找零;95 元的最少找零硬币数是 3。又如,硬币系统是 10,7,5,1元,那么 12 元用贪心法得到的硬币数为
3,而最少硬币数是 2。
你的任务就是:对于任意的硬币系统和一个金钱数,请你编程求出最少的找零硬币数;
如果不能用这些硬币找零,请给出一种找零方法,使剩下的钱最少。
![](http://acm.nyist.net/JudgeOnline/admin/kind/attached/20140722093722_95341.jpg)
输入输入数据:
第 1 行,为 N 和 T,其中 1≤N≤50 为硬币系统中不同硬币数;1≤T≤100000 为需要用硬币找零的总数。
第 2 行为 N 个数值不大于 65535 的正整数,它们是硬币系统中各硬币的面值。
当n,t同时为0时结束。
输出输出数据:
如 T 能被硬币系统中的硬币找零,请输出最少的找零硬币数。
如 T 不能被硬币系统中的硬币找零,请输出剩下钱数最少的找零方案中的最少硬币数。
样例输入
4 12 10 7 5 1
样例输出
2
解题思路:
这个问题类似于01背包! 不同的是每种物品有无限件。我们只需要把01背包的v的次序改一下就可以。想一想问什么01背包要从按v递减的顺序开始循环。
代码:
#include<stdio.h> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> #define INF 0x1f1f1f1f using namespace std; int main() { int i, j, n, t; int dp[100010], v[55]; while(scanf("%d%d",&n,&t) &&(n + t)) { for(i = 0; i < n; i++) scanf("%d",&v[i]); memset(dp,INF,sizeof(dp));//因为要求最小的所以初值为最大值! printf("%d\n",dp[0]); dp[0] = 0; for(j = 0; j < n; j++) { for(i = v[j]; i <= t; i++) { dp[i] = min(dp[i], dp[i - v[j]] + 1);// } } for(i = t; i >= 0; i--) { if(dp[i] != INF) { printf("%d\n",dp[i]); break; } } } return 0; }
相关文章推荐
- UCOSIII移植到STM32上(待更)
- mysql分组取每组前几条记录(排名) 附group by与order by的研究
- Retrofit原理简析
- 类中赋值运算符重载函数
- SCI中et al. 和etc.的区别
- 练习题:
- random 头文件
- 表格化类的对象
- 团队任务个人博客-20160427
- 编程题:串珠子
- Yii 中 jQuery 的引入问题
- lightoj 1031 - Easy Game 【区间dp】360 2017笔试编程题3
- Win10怎么更换主题?win10设置主题图文教程
- jBPM4.4中配备MySQL的hibernate方言MySQLInnoDBDialect
- java输出重定向
- 面向对象——异常处理
- 识别工具
- maven(一)创建一个maven的web项目
- grunt解决前后端跨域问题
- 利用热门标签布局,实现单选列表