码迷,mamicode.com
首页 > 其他好文 > 详细

UVa 624 CD

时间:2016-07-30 16:45:56      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:

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 }
UVa 624 CD

NAILED IT..

-----------------------

 

UVa 624 CD

标签:

原文地址:http://www.cnblogs.com/shadyqwq-juruo/p/5721021.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!