POJ2392Space Elevator(贪心+背包)
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.
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.
* 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.
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 }