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 }

你可能感兴趣的:(action)