CD |
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
#include <cstdio> #include <cstring> const int MAX = 2000 + 5; int dp[MAX][MAX]; int n, w; int c[MAX], ans[MAX]; int maxValue(int a, int b) { return a>b?a:b; } int main() { // freopen("in.txt","r",stdin); while(scanf("%d %d", &w, &n)==2) { for(int i=1; i <= n; i++) scanf("%d", &c[i]); memset(dp,0,sizeof(dp)); for(int i=1; i <= n; i++) { for(int j=0; j <= w; j++) if(c[i] <= j) dp[i][j] = maxValue(dp[i-1][j], dp[i-1][j-c[i]]+c[i]); else dp[i][j] = dp[i-1][j]; } int length=0; for(int i=n, j=w; i > 0; i--) { if(j-c[i]>=0 && dp[i][j]==dp[i-1][j-c[i]]+c[i]) { ans[length++] = c[i]; j -= c[i]; } } for(int i=length-1; i>=0; i--) printf("%d ", ans[i]); printf("sum:%d\n",dp[n][w]); } return 0; }
UVa 624 - CD DP 0/1 背包问题,布布扣,bubuko.com
原文:http://blog.csdn.net/china_zoujinyong/article/details/20356841