题目:
首先按限制高度从小到大排序,不会影响可行解,而不排序可能卡掉正确的情况;
用%2滚动数组时一定注意每次复制上一种情况,因为这个WA了好几次。
代码如下:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int k,mx; bool f[3][400005]; struct N{ int h,a,c; }p[405]; bool cmp(N x,N y){return x.a<y.a;} int main() { scanf("%d",&k); for(int i=1;i<=k;i++) scanf("%d%d%d",&p[i].h,&p[i].a,&p[i].c),mx+=p[i].h*p[i].c; sort(p+1,p+k+1,cmp); f[0][0]=1; for(int i=1;i<=k;i++) { memcpy(f[i%2],f[(i-1)%2],sizeof f[(i-1)%2]);//!!! for(int j=p[i].h;j<=p[i].a;j++) for(int l=0;l<=p[i].c&&j-l*p[i].h>=0;l++) if(f[(i-1)%2][j-l*p[i].h])f[i%2][j]=1; } for(int j=mx;j>=0;j--) if(f[k%2][j]) { printf("%d",j); return 0; } }