POJ 2392 Space Elevator (dp)

Space Elevator
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 8929 Accepted: 4232

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_i (1 <= h_i <= 100) and is available in quantity c_i (1 <= c_i <= 10). Due to possible damage caused by cosmic rays, no part of a block of type i can exceed a maximum altitude a_i (1 <= a_i <= 40000). 

Help the cows build the tallest space elevator possible by stacking blocks on top of each other according to the rules.

Input

* Line 1: A single integer, K 

* Lines 2..K+1: Each line contains three space-separated integers: h_i, a_i, and c_i. Line i+1 describes block type i.

Output

* Line 1: A single integer H, the maximum height of a tower that can be built

Sample Input

3
7 40 3
5 23 8
2 52 6

Sample Output

48

- - 一道变形的完全背包 然后由于每个物品的高度限制 那么存在一种垒不上的情况 - -

所以要扫一遍求最大值

AC代码如下:

//
//  POJ 2392 Space Elevator
//
//  Created by TaoSama on 2015-03-06
//  Copyright (c) 2015 TaoSama. All rights reserved.
//
#include <algorithm>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <string>
#include <set>
#include <vector>
#define CLR(x,y) memset(x, y, sizeof(x))

using namespace std;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const int N = 1e5 + 10;

int n, dp[40005];
struct Block {
	int w, h, ct;
	bool operator<(const Block& rhs) const {
		return h < rhs.h;
	}
} a[405];

int main() {
#ifdef LOCAL
	freopen("in.txt", "r", stdin);
//	freopen("out.txt","w",stdout);
#endif
	ios_base::sync_with_stdio(0);

	while(cin >> n) {
		int V = -INF;
		for(int i = 1; i <= n; ++i) {
			cin >> a[i].w >> a[i].h >> a[i].ct;
			V = max(V, a[i].h);
		}
		sort(a + 1, a + 1 + n);
		memset(dp, 0, sizeof dp);
		for(int i = 1; i <= n; ++i)
			for(int k = 1; k <= a[i].ct; ++k)
				for(int j = a[i].h; j >= a[i].w; --j)
					dp[j] = max(dp[j], dp[j - a[i].w] + a[i].w);
		cout << *max_element(dp, dp + V + 1) << endl;
		//坑点 - - 有可能后面的垒不起来
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值