Space Elevator poj 2392(多重背包)
2016-06-25 21:08
281 查看
问题描述
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.
输入
* 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.
输出
* Line 1: A single integer H, the maximum height of a tower that can be built
样例输入
样例输出
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.
输入
* 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.
输出
* Line 1: A single integer H, the maximum height of a tower that can be built
样例输入
3 7 40 3 5 23 8 2 52 6
样例输出
48 先按照ai的大小排序然后就是完全背包了。 代码如下:
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std; int dp[40002];int sum[40002]; struct node { int h,c,a; }no[402]; bool operator<(node a,node b) { return a.a<b.a; } int main() { int n; scanf("%d",&n); int maxx=0; for(int i=1;i<=n;i++) { scanf("%d %d %d",&no[i].h,&no[i].a,&no[i].c); maxx=max(maxx,no[i].a); } sort(no+1,no+n+1); int ans=0; for(int i=1;i<=n;i++) { dp[0]=1; memset(sum,0,sizeof(sum)); for(int j=no[i].h;j<=no[i].a;j++) if(!dp[j]&&dp[j-no[i].h]&&sum[j-no[i].h]<no[i].c) { dp[j]=1; sum[j]=sum[j-no[i].h]+1; ans=max(ans,j); } } printf("%d\n",ans); }
相关文章推荐
- 23种设计模式
- 23种设计模式
- Mybatis 学习笔记
- ajax入门学习
- ffmpeg制作屏幕录像(一)
- 如何编写跨平台的Java代码
- 宿主机(centos7)虚拟化软件 KVM 安装方法
- 缓存淘汰算法--LRU算法
- Execution of Paladin(山东省第七届acm j题)
- 文件上传及导入数据库
- YourUninstaller注册码
- 图书管理系统
- C++银行储蓄程序代码
- Intent可传递的数据类型
- [Javascript] Fetch API
- 2016(第三届)智能家居世界大会
- 泛型中? super T和? extends T的区别
- Linux文件与目录管理总结
- Mvc model验证总结
- Flask EndPoint 理解