POJ 2392 Space Elevator [DP 多重背包]

原创 2012年03月22日 10:32:14

题意:

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


相关文章推荐

poj 2392 Space Elevator dp 多重背包

《挑战》练习题,dp,多重背包基础题。

POJ 2392 Space Elevator (多重背包+优化)

Space Elevator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7378   Accepted: 3...

poj 2392 Space Elevator(多重背包变形)

Space Elevator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5144   ...
  • fp_hzq
  • fp_hzq
  • 2011年10月05日 19:00
  • 1130

POJ 2392 Space Elevator(贪心+多重背包)

POJ 2392 Space Elevator(贪心+多重背包) http://poj.org/problem?id=2392 题意: 题意:给定n种积木,每种积木都有一个高度h[i],...

多重背包-POJ 2392 Space Elevator

POJ 2392题目大意如下: FJ的牛想上天,但是要借助梯子,现在有K种梯子,由于会收到宇宙射线的影响,所以每种梯子限定了能够到达的最大高度。给出K种梯子的单位长度、数量、以及允许到达的最大高度。...

poj 2392 Space Elevator(多重背包)

题意: k种石头(不用在意具体是什么东西),每种石头的高度为h,这种石头不能处于超过a的高度,数量为c,问最多能用这些石头叠出多大的高度 解题思路: 这是一道稍微有点改动的多重背包题目,...

POJ2392:Space Elevator(多重背包)

Description The cows are going to space! They plan to achieve orbit by building a sort of space elev...

POJ 2392 Space Elevator 多重背包

看见啸爷再看这道题目,也跟着看了看,看懂之后感觉有戏,很裸的背包,果然1A,嘿嘿。 题目大意:给你n种木块,然后让你输出最高可以组成的高度。 限制条件是:每种木块的个数,与木块的在高度h以上就不可...

POJ 2392 Space Elevator(多重背包)

题目链接: POJ 2392 Space Elevator 题意: 有n种梯子,每种梯子的单位长度是height[i],个数是num[i],这种梯子能达到的最大高度是limit[i]。问由这n...
  • Ramay7
  • Ramay7
  • 2016年04月11日 22:04
  • 167

poj 2392 Space Elevator(排序+多重背包)

思路:按高度的限制大小排序,再多重背包 #include #include #include #include #include #include #define CL(a,b) mem...
  • qianlv_
  • qianlv_
  • 2013年02月18日 14:37
  • 259
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 2392 Space Elevator [DP 多重背包]
举报原因:
原因补充:

(最多只允许输入30个字)