L3-001. 凑零钱(dfs或者01背包)
L3-001. 凑零钱
韩梅梅喜欢满宇宙到处逛街。现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债。韩梅梅手边有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";
}
L3-001. 凑零钱(dfs或者01背包)的更多相关文章
- c4 L3-001 找零钱 (简单01背包-输出最小字典序解(用vector保存当前最优解))
#include <iostream> #include <algorithm> #include <vector> #include <cstdio> ...
- PAT L3-001 凑零钱(01背包dp记录路径)
韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有104枚来自各个星球的硬币,需要请你帮她盘算一下,是 ...
- 天梯赛L3-001. 凑零钱(01背包记录物品)
L3-001. 凑零钱 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现 ...
- 01背包记录路径 (例题 L3-001 凑零钱 (30分))
题意: 就是找出来一个字典序最小的硬币集合,且这个硬币集合里面所有硬币的值的和等于题目中的M 题解: 01背包加一下记录路径,如果1硬币不止一个,那我们也不采用多重背包的方式,把每一个1硬币当成一个独 ...
- hdu3448 01背包+dfs
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3448 Description 0/1 bag problem should sound f ...
- POJ3628 Bookshelf 2(01背包+dfs)
Bookshelf 2 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8745 Accepted: 3974 Descr ...
- noj [1479] How many (01背包||DP||DFS)
http://ac.nbutoj.com/Problem/view.xhtml?id=1479 [1479] How many 时间限制: 1000 ms 内存限制: 65535 K 问题描述 The ...
- [Swust OJ 465]--吴奶奶买鱼(0-1背包+dfs)
题目链接:http://acm.swust.edu.cn/problem/465/ 还有一道题只是描述不一样,方法一模一样(http://acm.swust.edu.cn/problem/644/) ...
- 九度OJ 1123:采药 (01背包、DP、DFS)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2705 解决:1311 题目描述: 辰辰是个很有潜能.天资聪颖的孩子,他的梦想是称为世界上最伟大的医师. 为此,他想拜附近最有威望的医师为师 ...
随机推荐
- Kubernetes RBAC
在Kubernetes1.6版本中新增角色访问控制机制(Role-Based Access,RBAC)让集群管理员可以针对特定使用者或服务账号的角色,进行更精确的资源访问控制.在RBAC中,权限与角色 ...
- 安装使用snmp监控命令
1.安装snmp windows下载安装https://sourceforge.net/projects/net-snmp/ centos yum install -y net-snmp net-sn ...
- SpringMVC传递参数和获取参数以及返回数据
1.传递form表单,参数接收到对象,name和对象属性对应上即可: 2.springmvc不能直接通过form表单传递多个对象的list集合,要么采用ajax传递,要么采用封装了list属性的b ...
- maven 中pom.xml文件依赖包从本地加载如何配置?
比如我现在有一个需求是:项目中要加载ueditor的jar架构包,并且用maven构建的项目 那么在pom.xml文件中如配置: 说明:${project.basedir} 是maven 自带(内置) ...
- 研究Mac OS中Migration Assistant工具
一.对Migration Assistant工具的理解: 1.最精辟的定义是:Move your content to a new Mac. 如果想将windows上的数据迁移到mac上?使用工具Wi ...
- cdq分治入门and持续学习orz
感觉cdq分治是一个很有趣的算法 能将很多需要套数据结构的题通过离线来做 目前的一些微小的理解 在一般情况下 就像求三维偏序xyz 就可以先对x排序 然后分治 1 cdq_x(L,M) ; 2 提取出 ...
- 在Silverlight中使用SESSION
首先Session是运行在服务器上的,而Silverlight运行在客户端.因此在Silverlight中使用SESSION的说法并不准确, 只因大家经常这样搜索才起这个名字. 首先Session ...
- java: Comparable比较器,数组对象比较器
Arrays只适合一个数组/对象内的数值进行比较, Comparable比较器(Compara)适合数组,对象,队列等排序, Comparable是一个接口类,实现此接口必须复写:compareTo ...
- 图片放大器——wpf
<Grid> <Image x:Name="imgSource" Source="{Binding Web ...
- IIS7配置PHP简要说明
1. IIS7 安装的时候 要注意三个地方打得勾 万维网服务->应用程序开发功能->CGI ->ISAPI扩展 ->ISAPI筛选器 注: CGI 会在IIS7+PHP_ ...