标签:
Space Elevator
Time Limit: 1000MS |
|
Memory Limit: 65536K |
Total Submissions: 9042 |
|
Accepted: 4296 |
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
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
ac代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define INF 1<<30
#define max(a,b) (a>b?a:b)
#define min(a,b) (a>b?a:b)
struct s
{
int h,num,mh;
}b[440];
int dp[40040];
int cmp(const void *a,const void *b)
{
return (*(struct s *)a).mh-(*(struct s *)b).mh;
}
int n;
int main()
{
while(scanf("%d",&n)!=EOF)
{
int i,j,k;
for(i=0;i<n;i++)
{
scanf("%d%d%d",&b[i].h,&b[i].mh,&b[i].num);
}
qsort(b,n,sizeof(b[0]),cmp);
memset(dp,0,sizeof(dp));
for(i=0;i<n;i++)
{
for(k=1;k<=b[i].num;k++)
{
for(j=b[i].mh;j>=b[i].h;j--)
{
dp[j]=max(dp[j],dp[j-b[i].h]+b[i].h);
}
}
}
int ans=0;
for(i=0;i<=b[n-1].mh;i++)
{
ans=max(ans,dp[i]);
}
printf("%d\n",ans);
}
}
POJ 题目2392 Space Elevator(多重背包)
标签:
原文地址:http://blog.csdn.net/yu_ch_sh/article/details/44891177