CD
题目链接: UVA - 624题意: 一个轨道长度为n的CD, k首歌, 每首歌的长度不同, 问这张CD上最多能刻录多长的歌曲, 歌曲必须被整首刻录;最后输出CD上所刻的歌曲及总长度;
01背包加上路径记忆;
用二维数组记录路径vis[i][j] 表示第i首在长度为j是被录制;
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
using namespace std;
const int INF = 0x3f3f3f3f;
int n, k, t[1100], dp[11000], vis[110][11000];
int main(){
while(~scanf("%d%d", &n, &k)){
for(int i=1; i<=k; i++){
scanf("%d", &t[i]);
}
memset(dp, 0, sizeof(dp));
memset(vis, 0, sizeof(vis));
for(int i=1; i<=k; i++){
for(int j=n; j>=t[i]; j--){
if(dp[j]<=dp[j-t[i]]+t[i]){
dp[j]=dp[j-t[i]]+t[i];
vis[i][j]=1;//记录路径;
}
}
}//由后向前遍历;
for(int i=k, j=n; i>0; i--){
if(vis[i][j]){
printf("%d ", t[i]);
j-=t[i];
}
}
printf("sum:%d\n", dp[n]);
}
return 0;
}