uva624 CD   01背包+输出最优解

link:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=565

用一个二维数组g[i][v]表示:当状态转移到v的时候,第i个物品是不是用到,如果用到标记1,否则标记0.

输出路径的时候,注意,从物品编号0一直到n-1.如果某个物品被用到了,g[i][v]里面的v,就要减去这个物品的体积,然后继续往下找.

 1 /*
 2  * =====================================================================================
 3  *       Filename:  cd.cpp
 4  *        Created:  04/08/2013 15:21:34
 5  *         Author:  liuxueyang (lxy), 1459917536@qq.com
 6  *   Organization:  Hunan University
 7  *
 8  * =====================================================================================
 9  */
10 
11 /*
12 ID: zypz4571
13 LANG: C++
14 TASK: cd.cpp
15 */
16 #include <iostream>
17 #include <cstdlib>
18 #include <cstdio>
19 #include <cstring>
20 #include <cmath>
21 #include <cctype>
22 #include <algorithm>
23 #include <queue>
24 #include <set>
25 #include <stack>
26 #include <map>
27 #include <list>
28 #define INF 0x3f3f3f3f
29 #define MOD 1000000007
30 #define LL long long
31 const double eps=1e-9;
32 using namespace std;
33 int V, n, c[22], f[22222], g[22][22222];
34 int main ( int argc, char *argv[] )
35 {
36 #ifndef ONLINE_JUDGE
37     freopen("in.txt", "r", stdin);
38 #endif
39     ios::sync_with_stdio(false);
40     while (cin>>V) {
41         cin>>n;
42         for (int i = 0; i < n; ++i) cin>>c[i];
43         memset(f,0,sizeof(f));
44         memset(g,0,sizeof(g));
45         for (int i = n-1; i>=0; --i) {
46             for (int v = V; v>=c[i]; --v) {
47                 if (f[v] <= f[v-c[i]]+c[i]) {
48                     f[v] = f[v-c[i]]+c[i]; g[i][v] = 1;
49                 } else g[i][v] = 0;
50             }
51         }
52         for (int i = 0, j = V; i < n; ++i) {
53             if (g[i][j]) {
54                 cout<<c[i]<<' ';
55                 j-=c[i];
56             }
57         }
58         cout<<"sum:"<<f[V]<<endl;
59     }
60         return EXIT_SUCCESS;
61 }                /* ----------  end of function main  ---------- */

再一次表示vim比codeblocks好用多了,囧

原文地址:https://www.cnblogs.com/liuxueyang/p/3240055.html