标签:
UVa 624 CD 01背包记录路径
Descirption: NULL
「给你一张过去的CD 听听那时我们的爱情」
单纯的01背包 + 路径记录。
紫忆大神:
可以另开一个数组a[i][j],当dp[i][j]在动态转移时记录一下,取了物品i则a[i][j]=0,否则a[i][j]=1; 然后对数组a[i][j]进行回溯即可
给出两个方法打印。。递归和非递归
void print(int a, int b){
if(!a) return;
if(vis[a][b]){
print(a - 1, b - w[a]);
printf("%d ", w[a]);
}
else print(a - 1, b);
}
for(int i = n,j = m; i > 0; i --){
if(vis[i][j]){
printf("%d ",w[i]); j -= w[i];
}
}
渣代码:
1 #include <iostream>
2 #include <string.h>
3 #include <math.h>
4 #include <algorithm>
5 #include <stdlib.h>
6 #include <stdio.h>
7 #define ll long long
8
9 using namespace std;
10 int f[10005], w[30], n, m;
11 bool vis[30][10005];
12 void print(int a, int b){
13 if(!a) return;
14 if(vis[a][b]){
15 print(a - 1, b - w[a]);
16 printf("%d ", w[a]);
17 }
18 else print(a - 1, b);
19 }
20 int main()
21 {
22 while(~scanf("%d%d", &m, &n) && m + n){
23 memset(f, 0, sizeof(f));
24 memset(vis, 0, sizeof(vis));
25 for(int i = 1; i <= n; i ++){
26 scanf("%d", &w[i]);
27 }
28 for(int i = 1; i <= n; i ++){
29 for(int j = m; j >= w[i]; j --){
30 if(f[j] <= f[j - w[i]] + w[i]){
31 f[j] = f[j - w[i]] + w[i];
32 vis[i][j] = 1;
33 }
34 }
35 }
36 print(n, m);
37 //for(int i = n,j = m; i > 0; i --){
38 // if(vis[i][j]){
39 // printf("%d ",w[i]); j -= w[i];
40 // }
41 // }
42 printf("sum:%d\n", f[m]);
43 }
44 return 0;
45 }
NAILED IT..
-----------------------
标签:
原文地址:http://www.cnblogs.com/shadyqwq-juruo/p/5721021.html