UVA 624 CD (01背包+打印路径 或 dfs+记录路径)
2015-10-11 11:13
477 查看
Description
![](http://uva.onlinejudge.org/components/com_onlinejudge/images/button_pdf.png)
You have a long drive by car ahead. You have a tape recorder, but unfortunately your best music is on CDs. You need to have it on tapes so the problem to solve is: you have a tape N minutes long. How to choose tracks from CD to get most out of tape space and have as short unused space as possible.
Assumptions:
number of tracks on the CD. does not exceed 20
no track is longer than N minutes
tracks do not repeat
length of each track is expressed as an integer number
N is also integer
Program should find the set of tracks which fills the tape best and print it in the same sequence as the tracks are stored on the CD
题意:给出数m和n,再给出n个数,求从n个数中选出几个和最大的数,并按循序输出这些书和这些数的和。
dfs搜索并记录路径就可以了。也可以用01背包。
dfs:
01:
![](http://uva.onlinejudge.org/components/com_onlinejudge/images/button_pdf.png)
You have a long drive by car ahead. You have a tape recorder, but unfortunately your best music is on CDs. You need to have it on tapes so the problem to solve is: you have a tape N minutes long. How to choose tracks from CD to get most out of tape space and have as short unused space as possible.
Assumptions:
number of tracks on the CD. does not exceed 20
no track is longer than N minutes
tracks do not repeat
length of each track is expressed as an integer number
N is also integer
Program should find the set of tracks which fills the tape best and print it in the same sequence as the tracks are stored on the CD
Input
Any number of lines. Each one contains value N, (after space) number of tracks and durations of the tracks. For example from first line in sample data: N=5, number of tracks=3, first track lasts for 1 minute, second one 3 minutes, next one 4 minutesOutput
Set of tracks (and durations) which are the correct solutions and string `` sum:" and sum of duration times.Sample Input
5 3 1 3 4 10 4 9 8 4 2 20 4 10 5 7 4 90 8 10 23 1 2 3 4 5 7 45 8 4 10 44 43 12 9 8 2
Sample Output
1 4 sum:5 8 2 sum:10 10 5 4 sum:19 10 23 1 2 3 4 5 7 sum:55 4 10 12 9 8 2 sum:45
题意:给出数m和n,再给出n个数,求从n个数中选出几个和最大的数,并按循序输出这些书和这些数的和。
dfs搜索并记录路径就可以了。也可以用01背包。
dfs:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m,n1,sum,ans[22],a[22],str[22]; void dfs(int x,int s,int p) { if (s>m) return ; if (s>sum) { sum=s; for (int i=0;i<p;i++) ans[i]=str[i]; n1=p; } for (int i=x+1;i<=n;i++) { str[p]=a[i]; dfs(i,s+a[i],p+1); } } int main() { int i; while (~scanf("%d%d",&m,&n)) { sum=0; n1=0; for (i=1;i<=n;i++) scanf("%d",&a[i]); dfs(0,0,0); for (i=0;i<n1;i++) printf("%d ",ans[i]); printf("sum:%d\n",sum); } return 0; }
01:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dp[10005],v[22][10005]; int main() { int n,m,i,j; int a[22]; while (~scanf("%d%d",&m,&n)) { memset(dp,0,sizeof(dp)); memset(v,0,sizeof(v)); for (i=1;i<=n;i++) scanf("%d",&a[i]); for (i=n;i>=1;i--) { for (j=m;j>=a[i];j--) { if (dp[j]<dp[j-a[i]]+a[i]) { dp[j]=dp[j-a[i]]+a[i]; v[i][j]=1; } } } for (i=1,j=dp[m];i<=n;i++) { if (v[i][j]) { printf("%d ",a[i]); j-=a[i]; } } printf("sum:%d\n",dp[m]); } return 0; }
相关文章推荐
- Duang!你一定不知道的百度特效搜索
- Android Fragment的生命周期和返回栈(转)
- C++引用-运行时结构分析
- 《腾讯网UED体验设计之旅》
- 访谈: 从技术开发到核心管理的十年征途
- 异步任务 AsyncTask 进度条的更新
- ajax使用
- JavaScript设计模式--单例模式
- WCSP 2015 南京 空间信息网络相关论文
- 图解Linux命令之--chown命令
- VS2010 测试 -普通单元测试 http://www.cnblogs.com/rhythmK/archive/2012/04/20/2458832.html
- 策略模式
- 九、机器学习系统设计笔记之分类III:音乐体裁分类
- jstl标签的使用
- Android ViewPager多页面滑动切换以及动画效果
- word转化html
- 2015年6月数据库流行度排行榜
- Android应用程序注册广播接收器(registerReceiver)的过程分析
- 一道组合数取模题
- json使用