| 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