L3-001. 凑零钱

时间限制
200 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越

韩梅梅喜欢满宇宙到处逛街。现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债。韩梅梅手边有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
#include <bits/stdc++.h>
using namespace std;
#define maxn 11000
int vis[maxn];
int s[maxn];
int tmp[maxn];
int n, m;
int cnt;
int flag;
int all;
void dfs(int index,int sum, int cnt,int tol)//tol 为剩余的钱数
{
if(flag || sum > m || tol < m - sum)
return;
if(sum == m)
{
for(int i = ; i < cnt - ; i++)
printf("%d ",tmp[i]);
printf("%d\n",tmp[cnt - ]);
flag = ;
return;
}
for(int i = index + ; i < n; i++)
{
if(!vis[i] && s[i] <= m - sum)
{
vis[i] = ;
tmp[cnt] = s[i];
dfs(i,sum + s[i], cnt+, tol - s[i]);
if(flag) return;
vis[i] = ;
}
}
}
int main()
{ scanf("%d%d", &n, &m);
all = ;
for(int i = ; i < n; i++)
{
scanf("%d", &s[i]);
all += s[i];
}
sort(s, s + n);
cnt = ;
dfs(-,, cnt,all);
if(!flag)
printf("No Solution\n");
}

01

本来背包判断是否存在,然后dfs的 但是只有28分   然后学了下记录路径

b[sum]=a[i] 就是代表 sum的钱=a[i]+b[ sum-a[i] ] 这样递归下去 直接sum=0 这样就得到路径了

#include <bits/stdc++.h>
using namespace std; int dp[];
int b[];
int a[]; void dfs(int t)
{
if(t==b[t])
{
printf("%d",b[t]);
return ;
}
dfs(t-b[t]);
printf(" %d",b[t]);
} int main()
{
int n,m;
scanf("%d%d",&n,&m); for(int i=; i<=n; i++)
scanf("%d",&a[i]);
sort(a+,a+n+);
for(int i=; i<=n; i++)
{
for(int j=m; j>=a[i]; j--)
{
if(dp[j-a[i]] || j==a[i])//是否到达过 || 直接到达
{
if(dp[j]<=dp[j-a[i]]+)//dp[j] 表示j是由dp[j]个数组成 又因为数越多 组成的序列越小 数相同 用=号去更新
{
dp[j] = dp[j-a[i]]+;
b[j] = a[i]; //钱是j的时候 是由 (j-a[i])的时候+a[i]过来的
}
}
}
} if(!b[m])
puts("No Solution");
else dfs(m),puts("");
return ;
}

我28分的dfs

#include<iostream>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#include<set>
using namespace std;
int a[];
bool v[];
int c[];
int k=;
int n,m;
bool f=; void display(int s)
{
for(int i=;i<=n;i++)
{
if(c[i]==) break;
if(i!=) cout<<" "; cout<<c[i];
}
} void dfs(int sum,int s)
{
if(s>n||sum>m) return;
if(sum==m)
{
display(s);
f=;
return;
} for(int i=;i<=k-;i++)
{
if(v[i]) continue;
else
{
v[i]=;
c[s]=a[i];
dfs(sum+a[i],s+);
c[s]=;
if(f) return;
v[i]=;
}
}
} int main()
{ cin>>n>>m;
memset(v,,sizeof v);
for(int i=;i<=n;i++)
{
int x;
cin>>x;
if(x>m) continue;
a[k++]=x;
}
sort(a+,a+k);
dfs(,);
if(!f) cout<<"No Solution";
}

最新文章

  1. canvas画圆百分比显示
  2. 使用npm安装一些包失败了的看过来(npm国内镜像介绍)
  3. 2016年10月10日--穷举、迭代、while循环
  4. display:inline 遇上 li 无效? why?
  5. Git - Tutorial [Lars Vogel]
  6. &lt;邮件服务postfix+mysql&gt;MAIL第二篇
  7. Codeforces 337D Book of evil
  8. Tomcat 下配置OpenLayers proxy.cgi代理
  9. Linux基础知识(二)
  10. Oracle表的常用查询实验(一)
  11. PL/SQL连64位Oracle11g R2 win7 64旗舰环境
  12. Hibernate JPA 动态criteria语句针对null查询条件的特殊处理
  13. 折腾Java设计模式之模板方法模式
  14. tomcat部署项目启动采坑之UnknownHostException
  15. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2-&gt;新增模块管理界面导出功能(可按条件导出)
  16. Csharp—碎片知识积累
  17. jQuery的Cookie使用
  18. [HNOI2016]序列(未通过)
  19. kdump 调试手段
  20. PHP后台支付的开发:微信支付和支付宝支付

热门文章

  1. Android源码目录分析【转】
  2. Nginx location指令匹配顺序规则
  3. Python之Django总结
  4. SSIS的控制流之For循环容器
  5. release与debug的区别
  6. socket和多线程编程资料汇集-基础篇
  7. python中常用的文件和目录操作(一)
  8. MySQL 分区知识点(二)
  9. ionic2——环境配置篇
  10. Linux-Crontab服务