poj2392 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_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这题先要对a_i进行升序排序,因为每一个长度都有最大的限度,所以从最大限度值最小的开始背包。然后注意初始值都设为-1,dp[0]=0,因为这里要求的是恰好到一个高度,,并不是小于等于就行(有点抽象,仔细体会一下)。#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int max(int a,int b){return a>b?a:b;}struct node{int h,a,num;}b[500];bool cmp(node c,node d){return c.a<d.a;}int dp[40050];int main(){int n,m,i,j,k,sum;while(scanf("%d",&n)!=EOF){m=0;for(i=1;i<=n;i++){scanf("%d%d%d",&b[i].h,&b[i].a,&b[i].num);if(b[i].a>m)m=b[i].a;}sort(b+1,b+1+n,cmp);memset(dp,-1,sizeof(dp));dp[0]=0;for(i=1;i<=n;i++){if(b[i].h*b[i].num>=b[i].a){for(j=b[i].h;j<=b[i].a;j++){if(dp[j-b[i].h]!=-1)dp[j]=0;}}else{k=1;sum=0;while(sum+k<b[i].num){sum+=k;for(j=b[i].a;j>=k*b[i].h;j–){if(dp[j-k*b[i].h]!=-1)dp[j]=0;}k*=2;}k=b[i].num-sum;for(j=b[i].a;j>=k*b[i].h;j–){if(dp[j-k*b[i].h]!=-1)dp[j]=0;}}}for(i=m;i>=0;i–){if(dp[i]!=-1){printf("%d\n",i);break;}}}return 0;}

版权声明:本文为博主原创文章,未经博主允许不得转载。

带着感恩的心启程,学会爱,爱父母,爱自己,爱朋友,爱他人。

poj2392 Space Elevator

相关文章:

你感兴趣的文章:

标签云: