poj2392-Space Elevator


题目链接

题意:给出n种高度为h方块,每种有c个,求可用方块堆成的塔的最高高度,每种方块在塔中都有其限制高度a,塔中堆叠的方块的高度不可超过a

解法:多重背包

因为按a小则a在下的堆叠方式可得到最高高度,所以根据a对数据进行排序,而后按塔的高度从小往大进行状态转移;

#include
#include
using namespace std;
struct dop{
int a;
int c;
int h;
bool operator < (const dop x) const{
return a>n;
    for(int i=1;i<=40000;i++) dp[i]=-1;
    dp[0]=0;
    for(int i=0;i>p[i].h>>p[i].a>>p[i].c;
    sort(p,p+n);
    for(int i=0;i=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<