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的方案. 多重背包,不过这 ...
随机推荐
- python+xpath+requests爬取维基百科历史上的今天
import requests import urllib.parse import datetime from lxml import etree fhout = open("result ...
- 【GitHub】 README.ME 格式
README =========================== 该文件用来测试和展示书写README的各种markdown语法.GitHub的markdown语法在标准的markdown语法 ...
- 使用conda 对gcc进行升级 (sonicparanoid)
由于要是用python 3.6版本的一个包sonicparanoid,但是系统的gcc比较老,所以先用conda创建python环境,在该环境下尽心gcc的安装和升级 conda create --n ...
- ThinkPHP框架快捷键使用说明
ThinkPHP框架快捷键使用说明 php mvc框架ThinkPHP中有很多快捷键,但是很多时候我们不太明白它的意思,下面我简单的列了下他们的含义: A快速实例化Action类库 B执行行为类 C配 ...
- redis 最优雅的错误提示
Exception in thread "main" redis.clients.jedis.exceptions.JedisDataException: DENIED Redis ...
- 设置DatagridView的列头样式
设置DataGridView.ColumnHeaderDefaultCellStyle的BackColor属性会发现没有效果.这是因为在启动了可视样式的时候,BackColor和ForeColor的值 ...
- STM32F10x_ADC三通道逐次转换(单次、单通道软件触发)
Ⅰ.概述 本文讲述关于STM32功能比较强大的ADC模块.ADC(Analog to Digital Converter)也就是模拟量转化为数字量,而STM32的ADC模块功能比较多,本文主要讲述“三 ...
- 用SNMP实现对大型网络的轻松管理!
原文来自:http://guojiping.blog.51cto.com/5635432/985885 一.原理介绍: SNMP简介 目前网络中用得最广泛的网络管理协议是SNMP(Simple ...
- hadoop 1.1.2和 hive 0.10 和hbase 0.94.9整合
今天弄了一下hive0.10和hbase0.94.9整合,需要设置的并不多,但是也遇到了一些问题. 1.复制jar包 拷贝hbase-0.94.9.jar,zookeeper-3.4.5.jar,pr ...
- iOS彩票项目--第二天,自定义蒙版、封装活动菜单、自定义pop菜单
一.自定义蒙版--封装控件,先想好外界怎么来调用,根据外界调用的方法,然后进入内部实现 在外部,调用蒙版的方法--[ChaosCover show]; [ChaosCover hide]; 内部实现 ...