POJ 2392 Space Elevator
多重背包。先按排a[i]好序,然后倒叙多重背包。
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> struct node { int h,c,a; }bag[401]; int cmp(const void *q,const void *b) { return (*(struct node *)q).a > (*(struct node *)b).a ? 1:-1; } int p[401][40001],h[401],c[401],a[401]; int main() { int i,n,j,max,k,mix; scanf("%d",&n); max = 0; for(i = 0;i <= n-1;i ++) { scanf("%d%d%d",&bag[i].h,&bag[i].a,&bag[i].c); if(max < bag[i].a) max = bag[i].a; } qsort(bag,n,sizeof(bag[0]),cmp); for(i = 0;i <= n-1;i ++) p[i][0] = 1; for(i = bag[0].h,j = 1;j <= bag[0].c;i += bag[0].h,j ++) { if(i > bag[0].a) break; p[0][i] = 1; } for(i = 1;i <= n-1;i ++) { for(j = max;j >= 0;j --) { if(p[i-1][j]) { for(k = 1;k <= bag[i].c;k ++) { if(j+k*bag[i].h > bag[i].a) break; p[i][j+k*bag[i].h] = 1; } } } } mix = 0; for(i = 0;i <= n-1;i ++) { for(j = 0;j <= max;j ++) { if(mix < j&&p[i][j]) mix = j; } } printf("%d\n",mix); return 0; }