POJ 2392 Space Elevator(多重背包变形)
Q: 额外添加了最大高度限制, 需要根据 alt 对数据进行预处理么?
A: 是的, 需要根据 alt 对数组排序
Description
Help the cows build the tallest space elevator possible by stacking blocks on top of each other according to the rules.
Input
* 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
Sample Input
3
7 40 3
5 23 8
2 52 6
Sample Output
48
Hint
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.
思路:
- 对数据预处理, 按照 alt 排序
- 预处理, 倍增优化, 转化成 01 背包
- 求解 01 背包
总结:
1. 对 3 个数组, 以其中一个为根据排序, 一种解决方法是把三个数组绑定到一个对象中, 然后对对象排序
2. 犯了个致命的错误, 48行代码写成memset(dp, 0, sizeof(int)*V); 导致当 V 比较大时, h 也被置 0 了
代码:
#include <iostream>
#include <algorithm>
using namespace std;
int K;
const int MAXN = 40010;
bool dp[40010];
int h[MAXN], a[MAXN];
int V; struct block {
int h, a, c;
bool operator<(const block &other) const {
return this->a < other.a;
}
}; block blocks[MAXN];
int pre_process() {
sort(blocks, blocks+K);
int len = 0;
for(int i = 0; i < K; i ++) {
int rem = blocks[i].c;
int j = 0;
// 预处理,
while(rem) {
if(rem >= (1<<j)) {
h[len] = (1<<j)*blocks[i].h;
a[len] = blocks[i].a;
rem -= (1<<j);
j++;
if(h[len] > a[len])
continue;
len++;
}else{
h[len] = rem*blocks[i].h;
a[len] = blocks[i].a;
len++;
rem = 0;
}
}
}
return len;
} int solve_dp() {
int len = pre_process();
// 01背包
memset(dp, 0, sizeof(dp));
dp[0] = 1;
for(int i = 0; i < len; i ++) {
for(int v = V; v >= h[i]; v--) {
if(v > a[i]) continue;
if(!dp[v] && dp[v-h[i]]) {
dp[v] = true;
//printf("dp[%d] = true\n", v);
}
}
} for(int v = V; v >= 0; v --)
if(dp[v])
return v;
}
int main() {
freopen("E:\\Copy\\ACM\\测试用例\\in.txt", "r", stdin);
cin >> K;
int h_i, a_i, c_i;
V = 0;
for(int i = 0; i < K; i ++) {
scanf("%d%d%d", &blocks[i].h, &blocks[i].a, &blocks[i].c);
V = min(V+blocks[i].h*blocks[i].c, 40000);
} cout << solve_dp() << endl;
return 0;
}
update: 2014年3月14日10:35:10
1. 贪心策略是最大高度较小的先放
Q1: 对物品排序会对结果产生影响吗
A1: 会的. 假设只有两个物品, 最大高度不同, 显然最大高度较小的放前面可以获摆放的更高
Q2: 第二层循环, V 是怎么初始化的
A2: 上面的代码初始化比较随意, V 初始化为 40000 和 所有梯子高度之和 的较小值
POJ 2392 Space Elevator(多重背包变形)的更多相关文章
- poj 2392 Space Elevator(多重背包+先排序)
Description The cows are going to space! They plan to achieve orbit by building a sort of space elev ...
- POJ 2392 Space Elevator(贪心+多重背包)
POJ 2392 Space Elevator(贪心+多重背包) http://poj.org/problem?id=2392 题意: 题意:给定n种积木.每种积木都有一个高度h[i],一个数量num ...
- POJ 2392 Space Elevator(多重背包)
显然塔的总高度不会超过最大的a[i],而a[i]之前的可以到达的高度 是由a值更小的块组成,所以按照a从小到大的顺序去转移. 然后就是多重背包判断存在性了,几乎和coin那题一样. 数据没coin丧病 ...
- POJ 2392 Space Elevator 背包题解
多重背包.本题不须要二分优化.相对简单点.由于反复数十分小,小于10. 而添加一个限制每种材料的高度做法.假设使用逆向填表,那么仅仅须要从这个高度往小递归填表就能够了. 还有就是注意要排序,以限制高度 ...
- poj[2392]space elevator
Description The cows are going to space! They plan to achieve orbit by building a sort of space elev ...
- poj2392 Space Elevator(多重背包)
http://poj.org/problem?id=2392 题意: 有一群牛要上太空.他们计划建一个太空梯-----用一些石头垒.他们有K种不同类型的石头,每一种石头的高度为h_i,数量为c_i,并 ...
- POJ 2392 Space Elevator DP
该题与POJ 1742的思路基本一致:http://www.cnblogs.com/sevenun/p/5442279.html(多重背包) 题意:给你n个电梯,第i个电梯高h[i],数量有c[i]个 ...
- POJ 2392 Space Elevator 贪心+dp
题目链接: http://poj.org/problem?id=2392 题意: 给你k类方块,每类方块ci个,每类方块的高度为hi,现在要报所有的方块叠在一起,每类方块的任何一个部分都不能出现在ai ...
- poj 1742 Coins (多重背包)
http://poj.org/problem?id=1742 n个硬币,面值分别是A1...An,对应的数量分别是C1....Cn.用这些硬币组合起来能得到多少种面值不超过m的方案. 多重背包,不过这 ...
随机推荐
- MFC图形编辑器
前言 vs2015竟然可以完美打开工程,哈哈可以直接生成类图了.由于内容较多,所以根据内容的重要性会安排详略. https://github.com/bajdcc/GraphEditor/releas ...
- uboot的lds文件分析
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") ...
- jar包调用jar包内部和外部的配置文件
http://blog.csdn.net/lpftobetheone/article/details/32689467 **************************************** ...
- Django 缓存、信号
Reference: http://www.cnblogs.com/lianzhilei/p/6365877.html 缓存 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访 ...
- Android笔记(十一)第一个Fragment
Fragment是碎片的意思,能够參照Activity来理解Fragment,由于它们都能包括布局,都有自己的生命周期. 以下我们要让主活动包括两个碎片,而且让两个碎片充满屏幕 1.首先,新建两个碎片 ...
- java中的访问控制符
首先来一张图: 对于一个类而言访问控制符只有一个public和默认无修饰符.其他的几个访问修饰符对于变量和方法都可以使用. 下面介绍具体的使用. 1. 公有访问控制符(public) Java的类是通 ...
- DHCP服务器-DNS服务器-Samba服务器
DHCP服务器 DHCP在管理网络配置方面很有作用,特别是一个当一个网络的规模较大时,使用DHCP可极大的减少 管理员的工作量. DHCP分为两部分:服务端和客户端.服务端负责集中管理可动态分配的IP ...
- window上将MongoDB的启动加入到服务中
在系统管理员的命令行模式中: 进入mongo的安装目录,参照如下: 其中: --dbpath为保存的数据的路径 mongod --bind_ip --serviceName "MongoDB ...
- SpringMVC经典系列-15对SpringMVC的总结---【LinusZhu】
注意:此文章是个人原创,希望有转载须要的朋友们标明文章出处,假设各位朋友们认为写的还好,就给个赞哈.你的鼓舞是我创作的最大动力,LinusZhu在此表示十分感谢,当然文章中如有纰漏,请联系linusz ...
- Integer与int有什么区别?
Integer与int有什么区别? 由于面试的时候问到这个问题,所以就网上百度一下,发现一个大神说得非常好,非常清楚,所有就博文复制过来供“自己学习”.(这不是原文,原文底下有链接) ...