POJ 2392 Space Elevator 背包题解

多重背包,本题不需要二分优化。相对简单点。因为重复数十分小,小于10;

而增加一个限制每种材料的高度做法,如果使用逆向填表,那么只需要从这个高度往小递归填表就可以了。

还有就是注意要排序,以限制高度为标准从小到大排序,否则答案错误的。

#include <stdio.h>
#include <string.h>
#include <algorithm>
using std::sort;

const int MAX_K = 401;
const int MAX_H = 40001;
struct HCA
{
	int h, a, c;
	bool operator<(const HCA &hac)
	{
		return a < hac.a;
	}
};
HCA hca[MAX_K];
bool tbl[MAX_H];

inline int max(int a, int b) { return a > b ? a : b; }

int bagDP(int B)
{
	memset(tbl, 0, sizeof(tbl));
	tbl[0] = true;
	for (int i = 1; i <= B; i++)
	{
		int k = 1;
		for ( ; (k << 1) <= hca[i].c; k <<= 1)
		{
			for (int j = hca[i].a; j >= hca[i].h*k; j--)
				if (tbl[j-hca[i].h*k]) tbl[j] = true;
		}
		k = hca[i].c - k + 1;
		for (int j = hca[i].a; j >= hca[i].h*k; j--)
			if (tbl[j-hca[i].h*k]) tbl[j] = true;
	}
	int i = MAX_H - 1;
	for (; i > 0 && !tbl[i]; i--);
	return i;
}

int main()
{
	int blocks;
	scanf("%d", &blocks);
	for (int i = 1; i <= blocks; i++)
	{
		scanf("%d %d %d", &hca[i].h, &hca[i].a, &hca[i].c);
	}
	sort(hca, hca+blocks+1);
	printf("%d\n", bagDP(blocks));
	return 0;
}

POJ 2392 Space Elevator 背包题解,布布扣,bubuko.com

时间: 2024-10-08 03:41:37

POJ 2392 Space Elevator 背包题解的相关文章

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

POJ 2392 Space Elevator(贪心+多重背包) http://poj.org/problem?id=2392 题意: 题意:给定n种积木,每种积木都有一个高度h[i],一个数量num[i],还有一个限制条件,这个积木所在的位置不能高于limit[i],问能叠起的最大高度? 分析: 本题是一道多重背包问题, 不过每个物品的选择不仅仅要受该种物品的数量num[i]限制, 且该物品还受到limit[i]的限制. 这里有一个贪心的结论: 我们每次背包选取物品时都应该优先放置当前limi

poj 2392 Space Elevator (多重背包)

Space Elevator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8110   Accepted: 3843 题目大意  :一群牛要上天  用一些石块堆塔  给出石块的种类  及其每个种类的数量 和该种石块能出现的最高高度  和每种石块的数量 求怎么摆放才能堆得最高 多重背包模板题.... 将所有石块排序  把高度低的放下面 #include<iostream> #include<cstdio>

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

Description The cows are going to space! They plan to achieve orbit by building a sort of space elevator: a giant tower of blocks. They have K (1 <= K <= 400) different types of blocks with which to build the tower. Each block of type i has height h

POJ 2392 Space Elevator(多重背包)

Description The cows are going to space! They plan to achieve orbit by building a sort of space elevator: a giant tower of blocks. They have K (1 <= K <= 400) different types of blocks with which to build the tower. Each block of type i has height h

poj 2392 (Space Elevator) 1276 (Cash Machine)变形背包

这道题跟coins很像,看来楼教主的男人八题果然不简单. 进行coins式的背包处理就好了. 2392 #include<iostream> #include<algorithm> #include<string.h> #include<stdlib.h> #include<stdio.h> #define max(a,b) ((a)>(b)?(a):(b)) typedef long long ll; using namespace st

POJ 2392 Space Elevator 贪心+dp

题目链接: http://poj.org/problem?id=2392 题意: 给你k类方块,每类方块ci个,每类方块的高度为hi,现在要报所有的方块叠在一起,每类方块的任何一个部分都不能出现在ai以上的高度,问这些方块能叠的最高高度. 题解: 首先按ai升序排序,尽量让高度限制低的先排掉,如果不这样做一些转移会失效掉: 比如:h1=3,a1=3;h2=4,a2=7 如果先搭1再搭2则合法,但反过来则变成无效的转移了. 处理好顺序之后跑一遍背包就可以了,因为最大高度为40000,比较小,所以用

poj 2392 Space Elevator DP

该题与poj 1742的思路基本一致:http://www.cnblogs.com/sevenun/p/5442279.html(多重背包) 题意:给你n个电梯,第i个电梯高h[i],数量有c[i]个,但是每个电梯所在高度不能超过a[i]. 求问,怎么样的建造方案能够使电梯能够达到最大高度 思路:首先,必然要使电梯按a[i]进行排序,a[i]最小的电梯先建造.例如,电梯1,只能在高度20以下建造,而电梯2能在高度50以下建造,我当然先建造电梯1,否则如果先建造电梯2,就会导致我建造的高度早早超过

POJ 2392 Space Elevator

排序+背包. 先对按高度限制从小到大排序,然后做背包即可.0/1背包300多ms过的,可以用完全背包二进制优化. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int maxn=400+10; int n; struct X { int h,c,a; }s[maxn]; int dp[400000+10]; i

POJ 3211 Washing Clothes 背包题解

本题是背包问题,但是需要转化成背包的. 因为是两个人洗衣服,那么就是说一个人只需要洗一半就可以了,因为不能两个人同时洗一件衣服,所以就成了01背包问题了. 思路: 1 计算洗完同一颜色的衣服需要的总时间totTime 2 利用动态规划背包法求这些衣服能在那些时间点完成 3 求比(totTime+1)/2大的最小时间点 4 得到洗一种颜色衣服的时间,那么继续求下洗一种颜色衣服的时间 5 最后加起来就是答案了. 这个是算法问题. 剩下来就是考编程功力了,因为给出的数据,需要我们自己把衣服分类,分类之