Aszxqw

新博客地址 http://yanyiwu.com

POJ 2392 Space Elevator [DP 多重背包]

题意:

给定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;
}


阅读更多
文章标签: struct 优化 c
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

POJ 2392 Space Elevator [DP 多重背包]

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭