套多重背包前先按Altitude排序,1次AC,嘿嘿 不过跑了110MS,不知道大牛们0MS的怎么写的 代码: #include<iostream> #include<algorithm> using namespace std; struct node { int h; int a; int c; bool operator<(const node &t)const { if(a!=t.a) return a<t.a; } }block[401]; int opt[40001],u[40001]; int main() { int n,i,j,k,max=0,ans,t; cin>>n; for(i=0;i<n;i++) { cin>>block[i].h>>block[i].a>>block[i].c; } sort(block,block+n); opt[0]=1; ans=0; /*for(i=0;i<n;i++) { for(j=max;j>=0;j--) { if(opt[j]) { for(k=1;k<=block[i].c;k++) { t=j+k*block[i].h; if(t>block[i].a) break; if(t<=40000) { if(opt[t]) break; opt[t]=1; if(t>ans) ans=t; } } } max+=block[i].h*block[i].c; if(max>40000) max=40000; } }*/ for(i=0;i<n;i++) { memset(u,0,sizeof(u)); max+=block[i].h*block[i].c; if(max>40000) max=40000; for(j=0;j<=max;j++) { if(j<=block[i].a&&j>=block[i].h&&!opt[j]&&opt[j-block[i].h]&&u[j-block[i].h]<block[i].c) { opt[j]=1; if(j>ans) ans=j; u[j]=u[j-block[i].h]+1; } } } cout<<ans<<endl; }