方法同POJ1014-Dividing,唯一不同点在于每一种block有最大限定高度a,故要以a为关键字进行排序,使得最大高度小的在前,否则最大高度小的再后可能放不上去。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 using namespace std; 7 8 struct block 9 { 10 int h,a,c; 11 bool operator < (const block& x) const 12 { 13 return a<x.a; 14 } 15 }; 16 17 const int MAXN=40000+10; 18 int dp[MAXN]; 19 block m[405]; 20 int k,max=-1; 21 22 int main() 23 { 24 scanf("%d",&k); 25 memset(dp,-1,sizeof(dp)); 26 dp[0]=0; 27 int max=-1; 28 for (int i=0;i<k;i++) scanf("%d%d%d",&m[i].h,&m[i].a,&m[i].c); 29 sort(m,m+k); 30 for (int i=0;i<k;i++) 31 { 32 int a=m[i].a; 33 int h=m[i].h; 34 int c=m[i].c; 35 if (a>max) max=a; 36 for (int j=0;j<=a;j++) 37 { 38 if (dp[j]>=0) dp[j]=c; 39 else 40 { 41 if (j<h || dp[j-h]<=0) dp[j]=-1; 42 else dp[j]=dp[j-h]-1; 43 } 44 } 45 } 46 for (int i=max;i>=0;i--) if (dp[i]!=-1) 47 { 48 cout<<i<<endl; 49 break; 50 } 51 return 0; 52 }