多重背包变形--poj2392
来源:互联网 发布:现金流量表数据来源 编辑:程序博客网 时间:2024/04/30 03:36
Language:
Space Elevator
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 7307 Accepted: 3429
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每个物体有自己的高度限制,只需要把上限改为自己的限制即可,要先计算限制小的,也就是要对a进行排序#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;struct A{ int h,a,c;} cow[405];int dp[400005];int max1,max2;bool com(A c,A b){ return c.a<b.a;}void zero(int hi,int ai){ for(int i=ai; i>=hi; i--) dp[i]=max(dp[i],dp[i-hi]+hi);}void complete(int hi,int ai){ for(int i=hi; i<=ai; i++) dp[i]=max(dp[i],dp[i-hi]+hi);}void mult(int cost,int hi,int ai,int ci){ if(hi*ci>=ai) complete(hi,ai); else { int k=1; while(k<ci) { zero(k*hi,ai); ci-=k; k*=2; } zero(ci*hi,ai); }}int main(){ //freopen("in.txt","r",stdin); int k; while(cin>>k) { //max2=-1; for(int i=1; i<=k; i++) { cin>>cow[i].h>>cow[i].a>>cow[i].c; } sort(cow+1,cow+k+1,com); max1=-1; memset(dp,0,sizeof(dp)); for(int i=1; i<=k; i++) mult(cow[i].h,cow[i].h,cow[i].a,cow[i].c); for(int i=0; i<=cow[k].a; i++) if(dp[i]>max1) max1=dp[i]; cout<<max1<<endl; } return 0;}
- 多重背包变形--poj2392
- poj2392 多重背包问题
- poj2392 多重背包
- poj2392 1742多重背包
- poj2392(多重背包)
- poj2392(Space Elevator + 多重背包)
- POJ2392:Space Elevator(多重背包)
- poj2392 Space Elevator(多重背包)
- 【Poj2392 Space Elevator】多重背包
- POJ2392-Space Elevator-多重背包
- poj2392 Space Elevator(多重背包)
- poj2392(多重背包,注意细节)
- POJ2392 Space Elevator (多重背包)
- 多重背包的简单问题 POJ2392
- poj2392 布尔值型 多重背包
- 多重背包变形--poj1742
- poj2392 多重背包也可转化为01背包
- poj2392 Space Elevator 多重背包转换为完全背包
- Linux学习笔记之 5 Linux GRUB启动管理器
- C语言:浮点数在内存中的表示
- 给vmware的Linux虚拟机添加硬盘
- Unity3D中受键盘控制的物体的简单移动
- centos6.4下定时通过ftp获取数据库服务器上的文件并且删除远程目录里面的文件
- 多重背包变形--poj2392
- poj 2243 Knight Moves
- StringBuffer toString 输出乱码问题
- php对用户输入数据的转义处理
- 如何卸载ROS,针对不同版本不太一样:【uninstall ros】
- 关于IplImage结构体内指针imageData指向的数据的数据类型的问题
- SVM多分类(利用libsvm工具箱)
- Linux 学习笔记之 6 Linux系统启动和服务
- c语言小代码——对齐