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的方案. 多重背包,不过这 ...
随机推荐
- 游戏开发tips之RTTI(1)
首先说明标题的含义,怎么感觉就和定义一种语言一样,需要有一个规约呢..... 标题定义如下:游戏开发tip之+内容+(总tips的第几篇) 扩展如下:内容(一,二,三.....) 新手可怜,大神每一句 ...
- java 多线程1:进程与线程概述
进程和线程 谈到多线程,就得先讲进程和线程的概念. 进程 进程可以理解为受操作系统管理的基本运行单元.360浏览器是一个进程.WPS也是一个进程,正在操作系统中运行的".exe"都 ...
- MyLocationService
package com.baidu.location.service; import android.app.Service;import android.content.Intent;import ...
- cjson库
- 源码方式引用,只有两个文件- 标准C89编写 - [cJSON 库项目地址](https://github.com/DaveGamble/cJSON)
- [WF4.0 实战] AutoResetEvent具体解释(线程独占訪问资源)
由来: 在学习工作流的过程中,宿主程序中会出现这么一段代码: staticAutoResetEvent instanceUnloaded = new AutoResetEvent(false); 然后 ...
- 标准Drupal7安装中文翻译出错解决办法
这个问题在网上解决的方案一致都是说在\sites\default\settings.php文件,在最后增加以下两行: ini_set('memory_limit', '1280M'); //加大php ...
- Linux启动与禁止SSH用户及IP的登录
以下就针对SSH方面讨论一下.假设有人特别关注Linux环境的安全性,第一就从login方面来进行讨论 1:Linux启动或禁止SSH root用户的登录 2:Linux限制SSH用户 事实上这些东西 ...
- ansible 变量传递到include
Task Include Files And Encouraging Reuse 假设您想在play或playbook中重复使用任务列表. 您可以使用include文件来执行此操作. 使用includ ...
- rails路由
web敏捷开发 p317 depot > ruby script/console >>rs = ActionController::Routing::routes 可以简单测试 比如 ...
- mysql主服务器 binlog_format 的 statement,row, mixed 三种格式对比。
主服务器的日志格式用哪种好? 有 statement,row, mixed3种,其中mixed是指前2种的混合. 以insert into xxtable values (x,y,z)为例, 影响: ...