BZOJ 1739: [Usaco2005 mar]Space Elevator 太空电梯
题目
1739: [Usaco2005 mar]Space Elevator 太空电梯
Time Limit: 5 Sec Memory Limit: 64 MB
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
7 40 3
5 23 8
2 52 6
Sample Output
从底部开始,先放3个方块2,之后3个方块1,接下来6个方块3.不能把3个方块1堆到4个方
块2上,因为这样最高的方块1的顶部高度超过了40.
HINT
Source
题解
Orz考完小四门的期中考试,来刷刷水题愉悦一下身心!Orz坑爹的生物一共75分钟竟然70道选择题一堆大题,我还好几周没去,呵呵~好的,这道题目其实就是做n遍有限背包~
代码
1 /*Author:WNJXYK*/ 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 6 struct Node{ 7 int c; 8 int h; 9 int a; 10 }; 11 Node k[405]; 12 bool f[40005]; 13 bool cmp(Node a,Node b){ 14 if (a.a<b.a)return true; 15 return false; 16 } 17 int n; 18 int main(){ 19 scanf("%d",&n); 20 for (int i=1;i<=n;i++) scanf("%d%d%d",&k[i].h,&k[i].a,&k[i].c); 21 f[0]=true; 22 sort(k+1,k+n+1,cmp); 23 for (int i=1;i<=n;i++){ 24 for (int h=k[i].a;h>=0;h--){ 25 for (int j=1;j<=k[i].c&&k[i].h*j+h<=k[i].a;j++){ 26 f[k[i].h*j+h]=f[k[i].h*j+h]||f[h]; 27 } 28 } 29 } 30 int Ans=0; 31 for (int i=40000;i>=0;i--) 32 if (f[i]){ 33 Ans=i; 34 break; 35 } 36 printf("%d\n",Ans); 37 return 0; 38 }