标签:
Description
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
大意:最优解的回溯.要求输出最优解的各个阶段的值,用一个path[i][j]记录(PS:偶尔用个index结果是库定义~~~~编译错了四次....),因为输出是从前到后,一开始就要最优解,所以前面01背包的处理要反一下,每一次的得到最优解之后,j-=w[i]
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int main() { int dp[10005],w[25]; int path[25][10005]; int n,m; while(~scanf("%d%d",&n,&m)){ memset(dp,0,sizeof(dp)); memset(w,0,sizeof(w)); memset(path,0,sizeof(path)); for(int i =1; i <= m ; i++) scanf("%d",&w[i]); for(int i = m; i >= 1 ;i--){ for(int j = n; j >= w[i]; j--){ if(dp[j] < dp[j-w[i]]+w[i]){ dp[j] = dp[j-w[i]]+w[i]; path[i][j] = 1; } } } for(int i = 1,j = n; i <= m ; i++){ if(path[i][j]){ printf("%d ",w[i]); j -= w[i]; } } printf("sum:%d\n",dp[n]); } return 0; }
标签:
原文地址:http://www.cnblogs.com/zero-begin/p/4445565.html