POJ 2392 Space Elevator DP
该题与POJ 1742的思路基本一致:http://www.cnblogs.com/sevenun/p/5442279.html(多重背包)
题意:给你n个电梯,第i个电梯高h[i],数量有c[i]个,但是每个电梯所在高度不能超过a[i].
求问,怎么样的建造方案能够使电梯能够达到最大高度
思路:首先,必然要使电梯按a[i]进行排序,a[i]最小的电梯先建造。例如,电梯1,只能在高度20以下建造,而电梯2能在高度50以下建造,我当然先建造电梯1,否则如果先建造电梯2,就会导致我建造的高度早早超过了20,这样就无法充分利用了电梯1。
动态规划,想到转移方程为d[i][j],前i个电梯建造到高度j时,第i个电梯所剩余多少个。
默认d[i][j]为-1,代表前i个电梯无法达到高度j。
对于d[i][j],如果前i-1个电梯的建造已能够达到高度j,那么到高度j自然就不需要第i个电梯,所以就剩余c[i]个电梯
如果前i-1个电梯的建造不能达到高度j,那么我自然就要利用第i个电梯看看是否能够达到高度j,所以d[i][j] = d[i][j-h[i]]-1。
滚动数组:由于n最大为400,且a[i]最大为40000,那么由上面的定义,那么数组肯定就要达到400*40000了,感觉内存不够了
所以观察方程可知,d[i][j]的计算只会涉及到前一行和当前行,所以可以利用滚动数组,从而减少内存的使用。
AC代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int K = 404;
const int H = 40005;
int n,d[2][H];
struct node
{
int a,c,h;
}w[K];
int cmp(node n1, node n2)
{
return n1.a < n2.a;
}
void solve()
{
int f = 1;
memset(d, -1, sizeof(d));
sort(w,w+n,cmp);
for(int j = 0; j*w[0].h <= w[0].a; j++)
d[0][j*w[0].h] = w[0].c - j;
for(int i = 1; i < n; i++)
{
d[f][0] = w[i].c;
for(int j = 1; j <= min(w[i].a, H); j++)
{
if(d[!f][j] >= 0) d[f][j] = w[i].c;
else if(j >= w[i].h) d[f][j] = d[f][j-w[i].h]-1;
else d[f][j] = -1;
d[!f][j] = -1;
}
d[!f][0] = -1;
f = !f;
}
int ans = 0;
for(int i = w[n-1].a; i >= 0; i--)
{
ans = i;
if(d[!f][i]>= 0) break;
}
printf("%d\n", ans);
}
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
while(~scanf("%d", &n))
{
for(int i = 0; i < n; i++)
scanf("%d %d %d", &w[i].h, &w[i].a, &w[i].c);
solve();
}
return 0;
}
POJ 2392 Space Elevator DP的更多相关文章
- POJ 2392 Space Elevator(贪心+多重背包)
POJ 2392 Space Elevator(贪心+多重背包) http://poj.org/problem?id=2392 题意: 题意:给定n种积木.每种积木都有一个高度h[i],一个数量num ...
- 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(多重背包变形)
Q: 额外添加了最大高度限制, 需要根据 alt 对数据进行预处理么? A: 是的, 需要根据 alt 对数组排序 Description The cows are going to space! T ...
- 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 贪心+dp
题目链接: http://poj.org/problem?id=2392 题意: 给你k类方块,每类方块ci个,每类方块的高度为hi,现在要报所有的方块叠在一起,每类方块的任何一个部分都不能出现在ai ...
- POJ 2392 Space Elevator 背包题解
多重背包.本题不须要二分优化.相对简单点.由于反复数十分小,小于10. 而添加一个限制每种材料的高度做法.假设使用逆向填表,那么仅仅须要从这个高度往小递归填表就能够了. 还有就是注意要排序,以限制高度 ...
- POJ 2392 Space Elevator(多重背包)
显然塔的总高度不会超过最大的a[i],而a[i]之前的可以到达的高度 是由a值更小的块组成,所以按照a从小到大的顺序去转移. 然后就是多重背包判断存在性了,几乎和coin那题一样. 数据没coin丧病 ...
- A - Space Elevator(动态规划专项)
A - Space Elevator Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u ...
- poj2392 Space Elevator(多重背包问题)
Space Elevator Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8569 Accepted: 4052 ...
随机推荐
- [Err] 1449 - The user specified as a definer ('admin_isbox'@'localhost') does not exist
晚上加班调用一个远程拷贝的本地Mysql的储存过程,报错:[Err] 1449 - The user specified as a definer ('admin_isbox'@'localhost' ...
- Android应用盈利广告平台的嵌入方法详解
一.如何学习Android android开发(这里不提platform和底层驱动)你需要对Java有个良好的基础,一般我们用Eclipse作为开发工具.对于过多的具体知识详细介绍我这里不展开,我只 ...
- jquery之null的数组
去掉null的数组 function ClearNullArr(arr) { for (var i = 0; i < arr.length; i++) { if(arr[ ...
- ASP.NET网页抓取数据
我的数据通过一个TextBox输入,这些代码是写在一个button的点击事件里的. 网页数据抓取大概分为两步,第一步是获取网页源代码: 具体注释如下: var currentUrl = TextBox ...
- Ubuntu + hadoop2.6.0下安装Hive
第一步:准备hive和mysql安装包 下载hive 1.1.1 地址:http://www.eu.apache.org/dist/hive/ 下载Mysql JDBC 5.1.38驱动:http:/ ...
- 诡异的SpriteKit 游戏查错
在Endless Runner 游戏中,做了一些atlas后,发现有个问题,当player跳跃起来的时候,发现他没有动画了,被默认的X图片代替.原来的图像是这样的. 在增加了一些动画后,我的效果就成这 ...
- 关于HTML的使用。
一丶标签问题 对于初学者来说,无疑用得最多的标签就是div和span了,当然就算只用这2个标签也能写出一个好看的页面,但是W3C为什么会给我们这么多标签来选择呢? 从浏览器的渲染来讲,标签的语义话,更 ...
- 04--帮助类ScreenAdapter编写
使用VS类向导添加ScreenAdapter,在Num2048项目上右键选择"添加"->"类",然后将生成的两个文件拖放到Classes文件夹中 ...
- Jquery各版本下载,附Jquery官网下载方法
jQuery version 2.1.1 http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.1.1.js http://ajax.aspnetcdn.com ...
- 网页中flash背景透明
<embed src="文件路径" width="长度" height="宽度" quality="high" t ...