您的位置:首页 > 其它

【动态规划/多重背包问题】POJ2392-Space Elevator

2015-06-28 19:07 295 查看
方法同POJ1014-Dividing,唯一不同点在于每一种block有最大限定高度a,故要以a为关键字进行排序,使得最大高度小的在前,否则最大高度小的再后可能放不上去。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;

struct block
{
int h,a,c;
bool operator < (const block& x) const
{
return a<x.a;
}
};

const int MAXN=40000+10;
int dp[MAXN];
block m[405];
int k,max=-1;

int main()
{
scanf("%d",&k);
memset(dp,-1,sizeof(dp));
dp[0]=0;
int max=-1;
for (int i=0;i<k;i++) scanf("%d%d%d",&m[i].h,&m[i].a,&m[i].c);
sort(m,m+k);
for (int i=0;i<k;i++)
{
int a=m[i].a;
int h=m[i].h;
int c=m[i].c;
if (a>max) max=a;
for (int j=0;j<=a;j++)
{
if (dp[j]>=0) dp[j]=c;
else
{
if (j<h || dp[j-h]<=0)  dp[j]=-1;
else dp[j]=dp[j-h]-1;
}
}
}
for (int i=max;i>=0;i--) if (dp[i]!=-1)
{
cout<<i<<endl;
break;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: