L3-001. 凑零钱(dp)
2016-07-07 15:44
295 查看
#include<cstdio> #include<algorithm> #include<cstring> #include<stack> using namespace std; const int INF=-0x3fffffff; stack<int>s; int dp[10001],pre[10001],a[10001]; int main() { for(int i=0;i<=10001;++i) { dp[i]=INF; } dp[0]=0; int n,m; scanf("%d%d",&n,&m); for(int i=0;i<n;++i) scanf("%d",&a[i]); sort(a,a+n); for(int i=0;i<n;++i) for(int j=m;j>=a[i];--j) { if(dp[j]<=dp[j-a[i]]+1)//核心代码 { dp[j]=dp[j-a[i]]+1; pre[j]=j-a[i]; } } if(dp[m]>0) { int k=m; while(pre[k]) { s.push(k-pre[k]); k=pre[k]; } printf("%d",k); while(!s.empty()) { printf(" %d",s.top()); s.pop(); } printf("\n"); } else printf("No Solution\n"); return 0; }
韩梅梅喜欢满宇宙到处逛街。现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债。韩梅梅手边有104枚来自各个星球的硬币,需要请你帮她盘算一下,是否可能精确凑出要付的款额。
输入格式:
输入第一行给出两个正整数:N(<=104)是硬币的总个数,M(<=102)是韩梅梅要付的款额。第二行给出N枚硬币的正整数面值。数字间以空格分隔。
输出格式:
在一行中输出硬币的面值 V1 <= V2 <= ... <= Vk,满足条件 V1 + V2
+ ... + Vk = M。数字间以1个空格分隔,行首尾不得有多余空格。若解不唯一,则输出最小序列。若无解,则输出“No Solution”。
注:我们说序列{A[1], A[2], ...}比{B[1], B[2], ...}“小”,是指存在 k >= 1 使得 A[i]=B[i] 对所有 i < k 成立,并且 A[k] < B[k]。
输入样例1:
8 9 5 9 8 7 2 3 4 1
输出样例1:
1 3 5
输入样例2:
4 8 7 2 4 3
输出样例2:
No Solution
相关文章推荐
- 验证手机号、用户名的正则表达式
- ubuntu ssh
- iOS “No such file or directory” 报错解决
- 新版caffe FCN的使用教程
- spring事物管理相关配置
- [bzoj 2588] Spoj 10628. Count on a tree:函数式线段树
- JavaScript中判断对象类型的种种方法
- BABOK - 企业分析(Enterprise Analysis)
- Palindrome Permutation
- 网络编码概述
- 多线程实现百度图片爬虫
- Spring AOP基础知识学习——Annotation配置
- hud 1548 A strange lift
- plsql
- BZOJ_1029_[JSOI2007]_建筑抢修_(贪心+优先队列)
- 1156 作业调度方案
- oracle创建索引后sqlldr导入错误
- Spring源代码解析(收藏)
- EXCEL表格中把汉字转换成unicode编码
- 三大框架环境配置