题目:http://poj.org/problem?id=2392
一定要先按高度限制由小到大排序!
不然就相当于指定了一个累加的顺序,在顺序中是不能做到“只放后面的不放前面的”这一点的!
数组是四十万,不是四万。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,v[1605],l[1605],cnt,mx; bool d[400005]; struct Node{ int c,a,h; }r[405]; void fen(int k) { int tmp=1,mul=1; while(mul<=r[k].c) { v[++cnt]=tmp*r[k].h; l[cnt]=r[k].a; // printf("v=%d l=%d ",v[cnt],l[cnt]); // printf("cnt=%d ",cnt); tmp<<=1; mul+=tmp; } int res=r[k].c-(mul-tmp); if(res) { v[++cnt]=res*r[k].h; l[cnt]=r[k].a; // printf("v=%d l=%d cnt=%d ",v[cnt],l[cnt],cnt); } } bool cmp(Node a,Node b){return a.a<b.a;} int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d%d",&r[i].h,&r[i].a,&r[i].c),mx+=r[i].c*r[i].h; sort(r+1,r+n+1,cmp); for(int i=1;i<=n;i++) fen(i); d[0]=1; for(int i=1;i<=cnt;i++) for(int j=l[i];j>=v[i];j--) if(!d[j]&&j<=l[i]) { // printf("j=%d v[i]=%d ",j,v[i]); d[j]|=d[j-v[i]]; // printf("d[j]=%d ",d[j]); } for(int i=mx;i>=0;i--) if(d[i]) { printf("%d",i); return 0; } }