标签:
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:
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
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
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
解题:01背包+打印路径
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <stack> 5 using namespace std; 6 const int maxn = 10001; 7 int dp[25][maxn],dur[maxn],n,m; 8 stack<int>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 }
标签:
原文地址:http://www.cnblogs.com/crackpotisback/p/4415811.html