Space Elevator
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 9970 | Accepted: 4738 |
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.
题意:奶牛想上太空给顶n种梯子,每种梯子对应三个值,a,h,c,a表示这种梯子必须在小于等于a的高度内使用,h表示它的高度,c表示这种梯子的个数。问内牛能够累出的最大高度。
分析:根据a从小到大排序,然后对于每一个找到背包容量为a的最大高度,可以用01背包处理,对每一个奶牛的梯子作为一个物品,物品的种数就是c;当然也可以用多重背包解
思路就是辣么简单就是没想出来,弱渣
1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 #include <cstdio> 5 using namespace std; 6 const int MAX = 50000; 7 int dp[MAX]; 8 struct node 9 { 10 int h,a,c; 11 }; 12 node cow[500]; 13 int cmp(node x, node y) 14 { 15 return x.a < y.a; 16 } 17 18 int main() 19 { 20 int k; 21 while(scanf("%d", &k) != EOF) 22 { 23 for(int i = 0; i < k; i++) 24 { 25 scanf("%d%d%d",&cow[i].h,&cow[i].a,&cow[i].c); 26 } 27 memset(dp,0,sizeof(dp)); 28 sort(cow, cow + k, cmp); 29 for(int i = 0; i < k; i++) 30 { 31 for(int t = 1; t <= cow[i].c; t++) 32 { 33 for(int j = cow[i].a; j >= cow[i].h; j--) 34 { 35 if(dp[j] <= cow[i].a && dp[j - cow[i].h] + cow[i].h <= cow[i].a) 36 dp[j] = max(dp[j], dp[j - cow[i].h] + cow[i].h); 37 } 38 } 39 } 40 int ans = 0; 41 for(int i = 1; i <= cow[k - 1].a; i++) //这一步还是在斌神那里得到的提示,太弱了 42 ans = max(ans, dp[i]); 43 printf("%d\n", ans); 44 } 45 return 0; 46 }