POJ2392-Space Elevator-多重背包
来源:互联网 发布:亿用户级软件 编辑:程序博客网 时间:2024/05/16 17:59
原题链接
Space Elevator
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 11392 Accepted: 5433
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.
OutputLine 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
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn = 40000 + 10;typedef struct blocks{ int h,a,c;}blocks;blocks a[410];int dp[maxn];bool cmp(blocks x,blocks y){ return x.a < y.a;}int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d%d",&a[i].h,&a[i].a,&a[i].c); sort(a+1,a+1+n,cmp);//对最大高度进行排序再按照多重背包的方法处理就好了 memset(dp,-1,sizeof(dp)); for(int i=1;i<=n;i++){ dp[0] = a[i].c; for(int j=1;j<=a[i].a;j++){ if(dp[j] >= 0) dp[j] = a[i].c; else if(j < a[i].h || dp[j-a[i].h] <= 0) dp[j] = -1; else dp[j] = dp[j-a[i].h] - 1; } } int loc=0;//注意这里一定要初始化为0,因为有可能给出的石头一个都不能用来搭电梯 for(int i = a[n].a;i>0;i--){ if(dp[i] >= 0){ loc = i; break; } } cout << loc << endl; return 0;}//下面是标准的滚动数组的形式,实际上本题可以更简化为1维dp如上// #include <cstdio>// #include <cstring>// #include <iostream>// #include <algorithm>// using namespace std;// const int maxn = 40000 + 10;// typedef struct blocks// {// int h,a,c;// }blocks;// blocks a[410];// int dp[2][maxn];// bool cmp(blocks x,blocks y){// return x.a < y.a;// }// int main(){// int n;// scanf("%d",&n);// for(int i=1;i<=n;i++) scanf("%d%d%d",&a[i].h,&a[i].a,&a[i].c);// sort(a+1,a+1+n,cmp);//对最大高度进行排序再按照多重背包的方法处理就好了// memset(dp,-1,sizeof(dp));// for(int i=1;i<=n;i++){// dp[i&1][0] = a[i].c;// for(int j=1;j<=a[i].a;j++){// if(dp[(i-1)&1][j] >= 0) dp[i&1][j] = a[i].c;// else if(j < a[i].h || dp[i&1][j-a[i].h] <= 0) dp[i&1][j] = -1;// else dp[i&1][j] = dp[i&1][j-a[i].h] - 1;// }// }// int loc=0;//注意这里一定要初始化为0,因为有可能给出的石头一个都不能用来搭电梯// for(int i = maxn - 1;i>0;i--){// if(dp[n&1][i] >= 0){// loc = i;// break;// }// }// cout << loc << endl;// return 0;// }
- poj2392(Space Elevator + 多重背包)
- POJ2392:Space Elevator(多重背包)
- poj2392 Space Elevator(多重背包)
- 【Poj2392 Space Elevator】多重背包
- POJ2392-Space Elevator-多重背包
- poj2392 Space Elevator(多重背包)
- POJ2392 Space Elevator (多重背包)
- poj2392 Space Elevator 多重背包转换为完全背包
- Space Elevator (多重背包)
- Space Elevator(多重背包)
- POJ_2392 Space Elevator(多重背包)
- poj2392 Space Elevator
- poj2392 - Space Elevator
- 【POJ2392】Space Elevator
- POJ2392:Space Elevator
- poj2392 Space Elevator
- [POJ2392]Space Elevator
- POJ2392-Space Elevator
- Echarts学习之使用要点步骤
- 逻辑思维训练(六)
- [python3教程]第八章.ERRORS AND EXCEPTIONS
- final,finally,finalize的区别
- 闲聊几种学习方式,选择比努力更重要
- POJ2392-Space Elevator-多重背包
- iOS - 打包提审,常见的被拒原因及解决
- c# winform 窗口 拆分多个源代码文件
- jq选择下拉框默认值
- c++ getline读取避免空行
- 2016.02.16回顾 决策树后剪枝
- 总结从端到云的4层缓存机制,以及各层的工具,容器 和配套支撑
- 残酷职场的生存法则的是什么?
- Java中的序列化以及反序列化