题意:给出n种高度为h方块,每种有c个,求可用方块堆成的塔的最高高度,每种方块在塔中都有其限制高度a,塔中堆叠的方块的高度不可超过a
解法:多重背包
因为按a小则a在下的堆叠方式可得到最高高度,所以根据a对数据进行排序,而后按塔的高度从小往大进行状态转移;
#include<iostream>
#include<algorithm>
using namespace std;
struct dop{
int a;
int c;
int h;
bool operator < (const dop x) const{
return a<x.a;
}
}p[405];
int dp[40005],n,ans;
int main(){
cin>>n;
for(int i=1;i<=40000;i++) dp[i]=-1;
dp[0]=0;
for(int i=0;i<n;i++) cin>>p[i].h>>p[i].a>>p[i].c;
sort(p,p+n);
for(int i=0;i<n;i++)
for(int j=p[i].a;j>=0;j--)
for(int k=1;k<=p[i].c&&k*p[i].h<=j;k++)
if(dp[j-k*p[i].h]!=-1){
dp[j]=max(dp[j],dp[j-k*p[i].h]+k*p[i].h);
ans=max(ans,dp[j]);
}
cout<<ans<<endl;
return 0;
}