题意:现在有N首歌曲,给出长度。将尽可能长的歌曲,刻录容量为N的磁带里。并输出对应的方案。
思路:输出对应方案的01背包,我们需要在递推的过程中记录过程就行了。
注意:以前只是写滚动数组的01背包,这回写完整的形式,手残了好几次。。
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int w[50],dp[50][2000],s[50][2000];
void print(int n, int sum)
{
if(n < 0)
return;
if(s[n][sum]){
print(n-1,sum-w[n]);
printf("%d ",w[n]);
}
else
print(n-1,sum);
}
int main(void)
{
//freopen("input.txt","r",stdin);
int N,M;
while(scanf("%d%d",&M,&N) != EOF){
for(int i = 1; i <= N; ++i)
scanf("%d",w+i);
memset(dp,0,sizeof(dp));
memset(s,0,sizeof(s));
for(int i = 1; i <= N; ++i){
for(int j = 0; j <= M; ++j){
if(j >= w[i] && dp[i-1][j] < dp[i-1][j - w[i]] + w[i]){
dp[i][j] = dp[i-1][j - w[i]] + w[i];
s[i][j] = 1;
}
else
dp[i][j] = dp[i-1][j];
}
}
print(N,dp[N][M]);
printf("sum:%d\n",dp[N][M]);
}
return 0;
}