UVa 624 - CD

这道题没有说明背包的最大容量,估计值取1500min(>=24h)。

这道题没有要求字典序,打印一种结果即可;

对保存中间结果的方法有点依赖了(浪费空间)。

 1 # include <stdio.h>
2 # include <memory.h>
3
4 int v[21];
5 int f[21][1500];
6 int p[21][1500];
7
8 void print_list(int m, int c);
9
10 int main()
11 {
12 int c, m, i, j;
13
14 while (~scanf("%d%d", &c, &m))
15 {
16 memset(f, 0, sizeof(f));
17 memset(p, 0, sizeof(p));
18
19 for (i = 1; i <= m; ++i)
20 {
21 scanf("%d", &v[i]);
22 for (j = 0; j <= c; ++j)
23 {
24 f[i][j] = f[i-1][j];
25 p[i][j] = 0;
26 if (j >= v[i] && f[i][j] < f[i-1][j-v[i]]+v[i])
27 {
28 f[i][j] = f[i-1][j-v[i]]+v[i];
29 p[i][j] = v[i];
30 }
31 }
32 }
33
34 print_list(m, c);
35 printf("sum:%d\n", f[m][c]);
36 }
37
38 return 0;
39 }
40
41 void print_list(int m, int c)
42 {
43 if (m == 0) return;
44 if (m == 1 && p[m][c] > 0) {printf("%d ", p[m][c]); return;}
45 if (p[m][c] > 0)
46 {
47 print_list(m-1, c-v[m]);
48 printf("%d ", v[m]);
49 }
50 else print_list(m-1, c);
51 }



posted on 2012-04-03 11:51  getgoing  阅读(545)  评论(0编辑  收藏  举报

导航