HDU 3339 In Action(背包+最短路)

题目链接

问了下学长,开始质量+价值反着背包,老是WA,油耗作为体积,核电做价值就AC了。。

反着背的时候 没取最小值啊 。。。。又想当然的以为大于1/2的时候,输出就行了,得取最小啊!!!!

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #include <math.h>
 5 #define N 10000000
 6 int p[101][101],low[101],v[101],key[20000];
 7 int main()
 8 {
 9     int t,i,j,k,n,m,sv,ev,w,sum,sum2;
10     scanf("%d",&t);
11     while(t--)
12     {
13         scanf("%d%d",&n,&m);
14         for(i = 0;i <= n;i ++)
15         {
16             for(j = 0;j <= n;j ++)
17             {
18                 p[i][j] =N;
19             }
20             p[i][i] = 0;
21         }
22         for(i = 1;i <= m;i ++)
23         {
24             scanf("%d%d%d",&sv,&ev,&w);
25             if(p[sv][ev] > w)
26             {
27                 p[sv][ev] = w;
28                 p[ev][sv] = w;
29             }
30         }
31         sum2 = 0;
32         for(i = 1;i <= n;i ++)
33         {
34             scanf("%d",&v[i]);
35             sum2 += v[i];
36         }
37         sum = 0;
38         for(k = 0;k <= n;k ++)
39         {
40             for(i = 0;i <= n;i ++)
41             {
42                 for(j = 0;j <= n;j ++)
43                 {
44                     if(p[i][j] > p[i][k]+p[k][j])
45                     p[i][j] = p[i][k]+p[k][j];
46                 }
47             }
48         }
49         for(i = 1;i <= n;i ++)
50         {
51             low[i] = p[0][i];
52             if(p[0][i] != N)
53             sum += low[i];
54         }
55         memset(key,0,sizeof(key));
56         for(i = 1;i <= n;i ++)
57         {
58             for(j = sum;j >= low[i];j --)
59             {
60                 if(key[j] < key[j-low[i]]+v[i])
61                 key[j] = key[j-low[i]]+v[i];
62             }
63         }
64         sum2 = sum2/2+1;
65         for(i = 1;i <= sum;i ++)
66         {
67             if(key[i] >= sum2)
68             {
69                 printf("%d\n",i);
70                 break;
71             }
72         }
73         if(i == sum+1)
74         printf("impossible\n");
75     }
76     return 0;
77 }

 反着背包的代码。。。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #include <math.h>
 5 #define N 10000000
 6 int p[101][101],low[101],v[101],key[20000];
 7 int main()
 8 {
 9     int t,i,j,k,n,m,sv,ev,w,sum,min;
10     scanf("%d",&t);
11     while(t--)
12     {
13         scanf("%d%d",&n,&m);
14         for(i = 0;i <= n;i ++)
15         {
16             for(j = 0;j <= n;j ++)
17             {
18                 p[i][j] =N;
19             }
20             p[i][i] = 0;
21         }
22         for(i = 1;i <= m;i ++)
23         {
24             scanf("%d%d%d",&sv,&ev,&w);
25             if(p[sv][ev] > w)
26             {
27                 p[sv][ev] = w;
28                 p[ev][sv] = w;
29             }
30         }
31         sum = 0;
32         for(i = 1;i <= n;i ++)
33         {
34             scanf("%d",&v[i]);
35             sum += v[i];
36         }
37         for(k = 0;k <= n;k ++)
38         {
39             for(i = 0;i <= n;i ++)
40             {
41                 for(j = 0;j <= n;j ++)
42                 {
43                     if(p[i][j] > p[i][k]+p[k][j])
44                     p[i][j] = p[i][k]+p[k][j];
45                 }
46             }
47         }
48         for(i = 1;i <= n;i ++)
49         {
50             low[i] = p[0][i];
51         }
52         key[0] = 0;
53         for(i = 1;i <= sum;i ++)
54         key[i] = N;
55         for(i = 1;i <= n;i ++)
56         {
57             for(j = sum;j >= v[i];j --)
58             {
59                 if(key[j] > key[j-v[i]]+low[i])
60                 key[j] = key[j-v[i]]+low[i];
61             }
62         }
63         min = N;
64         for(i = sum/2+1;i <= sum;i ++)
65         {
66             if(min > key[i])
67             {
68                min = key[i];
69             }
70         }
71         if(min == N)
72         printf("impossible\n");
73         else
74         printf("%d\n",min);
75     }
76     return 0;
77 }
posted @ 2012-08-11 19:28  Naix_x  阅读(167)  评论(0编辑  收藏  举报