关闭

POJ 2392 Space Elevator [DP 多重背包]

347人阅读 评论(0) 收藏 举报

题意:

给定n种砖块,每种砖块有c个,高度是w,在h高度下可以使用。

问怎样累加可以使总高度最高。

思路:

如果没有h高度约束的话显然是直接全部相加即可。

用dp解决,每个高度值 j 是一种状态。所以其实本质是背包问题。

因为每种砖块是有限个,所以是多重背包。用二进制优化时间。

但是因为h高度约束的问题,每个状态 j 只可能由 高度约束 h >=j 的砖块 有关。

所以要先由h高度进行从小到大排序再dp。


#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<cmath>
#include<algorithm>
#define llong long long
#define Min(a,b) (a<b?a:b)
#define Max(a,b) (a>b?a:b)
#define Abs(a) ((a)>0?(a):-(a))
#define Mod(a,b) (((a)-1+(b))%(b)+1)
using namespace std;
int n,m;
const int N=7005;
const int M=40005;
const int inf=99999999;
int dp[M];
struct Node
{
	int w,h;  
}node[N];
bool cmp(const Node &a,const Node &b)
{
	return a.h<b.h;
}
void solve()
{
	memset(dp,0,sizeof(dp));
	for(int i=1;i<=n;i++)
	{
		for(int j=node[i].h;j>=node[i].w;j--)
		{
			dp[j]=Max(dp[j],dp[j-node[i].w]+node[i].w);
		}
	}
	int ans=0;
	for(int i=1;i<=node[n].h;i++)
		ans=Max(ans,dp[i]);
	printf("%d\n",ans);
}
int main()
{
	int tmp,a,b,c;
	n=0;
	scanf("%d",&tmp);
	for(int i=1;i<=tmp;i++)
	{
		scanf("%d%d%d",&a,&b,&c);
		for(int j=1;c;j*=2)
		{
			n++;
			node[n].h=b;
			if(j<=c)
			{
				node[n].w=a*j;
				c-=j;
			}
			else
			{
				node[n].w=a*c;
				c=0;
			}
		}
	}
	sort(node+1,node+1+n,cmp);
	solve();
	return 0;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:301662次
    • 积分:5092
    • 等级:
    • 排名:第5675名
    • 原创:225篇
    • 转载:13篇
    • 译文:1篇
    • 评论:26条
    最新评论