博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA 624 CD
阅读量:5328 次
发布时间:2019-06-14

本文共 2503 字,大约阅读时间需要 8 分钟。

CD

Time Limit: 3000ms
Memory Limit: 131072KB
This problem will be judged on 
UVA. Original ID: 
64-bit integer IO format: %lld      Java class name: Main

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 minutes

 

Output 

Set of tracks (and durations) which are the correct solutions and string ``sum:" and sum of duration times.

 

Sample Input 

 

5 3 1 3 410 4 9 8 4 220 4 10 5 7 490 8 10 23 1 2 3 4 5 745 8 4 10 44 43 12 9 8 2

 

Sample Output 

1 4 sum:58 2 sum:1010 5 4 sum:1910 23 1 2 3 4 5 7 sum:554 10 12 9 8 2 sum:45 解题:01背包+打印路径
1 #include 
2 #include
3 #include
4 #include
5 using namespace std; 6 const int maxn = 10001; 7 int dp[25][maxn],dur[maxn],n,m; 8 stack
ans; 9 int main() {10 while(~scanf("%d %d",&m,&n)) {11 for(int i = 1; i <= n; ++i)12 scanf("%d",dur+i);13 memset(dp,0,sizeof(dp));14 while(!ans.empty()) ans.pop();15 for(int i = 1; i <= n; ++i) {16 for(int j = m; j >= 0; --j) {17 if(j >= dur[i] ) dp[i][j] = max(dp[i][j],dp[i-1][j-dur[i]] + dur[i]);18 dp[i][j] = max(dp[i][j],dp[i-1][j]);19 }20 }21 int ret = dp[n][m];22 for(int i = n; i && m; --i)23 if(dp[i][m] != dp[i-1][m]){24 ans.push(dur[i]);25 m -= dur[i];26 }27 while(!ans.empty()){28 printf("%d ",ans.top());29 ans.pop();30 }31 printf("sum:%d\n",ret);32 }33 return 0;34 }
View Code

 

转载于:https://www.cnblogs.com/crackpotisback/p/4415811.html

你可能感兴趣的文章
selenium-滚动
查看>>
read from and write to file
查看>>
使用vue的v-model自定义 checkbox组件
查看>>
Amcharts 柱状图和线形图
查看>>
APC注入
查看>>
关于ES6 Class语法相关总结
查看>>
文件处理
查看>>
[工具] Sublime Text 使用指南
查看>>
Hangfire在ASP.NET CORE中的简单实现方法
查看>>
今晚的比赛(2011.12.4)
查看>>
统计细菌基因组ORF
查看>>
Unity3D笔记 英保通三 脚本编写 、物体间通信
查看>>
python实现对某招聘网接口测试获取平台信息
查看>>
Algorithm——何为算法?
查看>>
Web服务器的原理
查看>>
小强升职计读书笔记
查看>>
常用的107条Javascript
查看>>
#10015 灯泡(无向图连通性+二分)
查看>>
获取EXe版本信息
查看>>
elasticsearch 集群
查看>>