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 }