POJ 2392 Space Elevator (多重背包问题)
来源:互联网 发布:机动战士z高达评价知乎 编辑:程序博客网 时间:2024/05/22 03:18
Space Elevator
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 6714 Accepted: 3116
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
37 40 35 23 82 52 6
Sample Output
48
思路:因为每种类型的砖头都有一定的高度限制,这样只要根据每种砖头的高度限制进行升序排序,把限制当作背包容量,分别进行多重背包。
View Code
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #define MAX 40005 6 7 using namespace std; 8 9 struct node10 {11 int height,limit,num;12 };13 14 node block[405];15 int dp[MAX];16 int K;17 18 bool cmp(node a,node b)19 {20 return a.limit < b.limit;21 }22 23 void multiPack(int ht,int n,int lmt)24 {25 if(ht * n > lmt)26 {27 for(int i=ht; i<=lmt; i++)28 dp[i] = max(dp[i],dp[i-ht]+ht);29 }30 else31 {32 int k = 1;33 int num = n;34 while(k < num)35 {36 for(int i=lmt; i>=ht*k; i--)37 dp[i] = max(dp[i],dp[i-k*ht]+k*ht);38 num -= k;39 k *= 2;40 }41 for(int i=lmt; i>=ht*num; i--)42 dp[i] = max(dp[i],dp[i-num*ht]+num*ht);43 }44 }45 46 int main()47 {48 scanf("%d",&K);49 for(int i=1; i<=K; i++)50 scanf("%d%d%d",&block[i].height,&block[i].limit,&block[i].num);51 sort(block+1,block+K+1,cmp);52 memset(dp,0,sizeof(dp));53 for(int i=1; i<=K; i++)54 multiPack(block[i].height,block[i].num,block[i].limit);55 int ans = 0;56 for(int i=1; i<=block[K].limit; i++)57 if(ans < dp[i])58 ans = dp[i];59 printf("%d\n",ans);60 return 0;61 }
- POJ 2392 Space Elevator (多重背包问题)
- poj 2392 Space Elevator 多重背包
- poj 2392 Space Elevator(多重背包变形)
- POJ 2392 Space Elevator [DP 多重背包]
- POJ 2392 Space Elevator (多重背包)
- poj 2392 Space Elevator(排序+多重背包)
- POJ 2392 Space Elevator 多重背包
- POJ 2392 Space Elevator (多重背包+优化)
- poj 2392 Space Elevator (多重背包)
- poj 2392 Space Elevator(多重背包)
- POJ 2392 Space Elevator 多重背包
- poj 2392 Space Elevator (多重背包)
- POJ 2392-Space Elevator(多重背包)
- POJ 2392 Space Elevator(贪心+多重背包)
- POJ 2392 Space Elevator 多重背包
- poj 2392 Space Elevator dp 多重背包
- poj Space Elevator 2392 (多重背包)
- 多重背包-POJ 2392 Space Elevator
- POJ 2318 TOYS (向量叉积的右手法则)
- POJ 1410 Intersection (判断线段与矩形是否相交)
- Hdu-1002(高精度加法_java)
- POJ 2653 Pick-up sticks (判断线段相交)
- HDU 1558 Segment set (并查集+线段相交)
- POJ 2392 Space Elevator (多重背包问题)
- POJ 1014 Dividing (多重背包问题)
- CodeForces #174.div2.problem C
- CodeForces #174.div2.problem E-----(DP)
- HDU 1160 FatMouse's Speed (最长上升子序列+记录路径)
- HDU 1561 The more,The Better (树形DP+有依赖的背包问题)
- HDU 4341 Gold miner (分组背包问题)
- POJ 3260 The Fewest Coins (混合背包--多重背包+完全背包)
- POJ 2127 Greatest Common Increasing Subsequence (最长公共上升子序列+记录路径)