POJ 2392 Space Elevator

来源:互联网 发布:sql 修改表结构 编辑:程序博客网 时间:2024/05/15 02:35
Space Elevator
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 8783 Accepted: 4173

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

37 40 35 23 82 52 6

Sample Output

48

Hint

OUTPUT DETAILS: 

From the bottom: 3 blocks of type 2, below 3 of type 1, below 6 of type 3. Stacking 4 blocks of type 2 and 3 of type 1 is not legal, since the top of the last type 1 block would exceed height 40.

Source

USACO 2005 March Gold

题意:一群牛要去太空,它们计划建造一种太空电梯--巨大的塔,现给出建造塔用的木块的高度,限制高度和数量,求塔的最大高度。

完全背包,但要先对木块的限制高度进行排序,以把较低的限制高度的木块尽量放在下面

#include <iostream>#include <stdio.h>#include <string.h>#include <math.h>#include <algorithm>using namespace std;int K;int dp[40010];struct node{int h;int a;int c;}block[500];int cmp(node a,node b){return a.a<b.a;}void ZeroOnePack(int cost,int weight,int lim){for(int i=lim;i>=cost;i--){dp[i]=max(dp[i],dp[i-cost]+weight);}}void CompletePack(int cost,int weight,int lim){for(int i=cost;i<=lim;i++){dp[i]=max(dp[i],dp[i-cost]+weight);}}void MultiplePack(int cost,int weight,int num,int lim){if(cost*num>=lim){CompletePack(cost,weight,lim);}else{int k=1;while(k<num){ZeroOnePack(k*cost,k*weight,lim);num-=k;k*=2;}ZeroOnePack(num*cost,num*weight,lim);}}int main(){scanf("%d",&K);for(int i=0;i<K;i++){scanf("%d%d%d",&block[i].h,&block[i].a,&block[i].c);}memset(dp,0,sizeof(dp));sort(block,block+K,cmp);int Max=0;for(int i=0;i<K;i++){MultiplePack(block[i].h,block[i].h,block[i].c,block[i].a);}for(int i=0;i<40010;i++){Max=max(Max,dp[i]);}printf("%d\n",Max);return 0;}


0 0
原创粉丝点击