题目链接:

http://poj.org/problem?id=2392

题意:

给你k类方块,每类方块ci个,每类方块的高度为hi,现在要报所有的方块叠在一起,每类方块的任何一个部分都不能出现在ai以上的高度,问这些方块能叠的最高高度。

题解:

首先按ai升序排序,尽量让高度限制低的先排掉,如果不这样做一些转移会失效掉:

比如:h1=3,a1=3;h2=4,a2=7

如果先搭1再搭2则合法,但反过来则变成无效的转移了。

处理好顺序之后跑一遍背包就可以了,因为最大高度为40000,比较小,所以用判定的方式跑一遍就可以了。

代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; const int maxn = + ;
const int maxm = ; int k;
int dp[maxn],used[maxn];
int hi[maxm], ai[maxm], ci[maxm]; int ran[maxm];
bool cmp(int x,int y) {
return ai[x] < ai[y];
} void init() {
memset(dp, , sizeof(dp));
for (int i = ; i < k; i++) ran[i] = i;
} int main() {
while (scanf("%d", &k) == && k) {
init();
for (int i = ; i < k; i++) {
scanf("%d%d%d", hi + i, ai + i, ci + i);
}
sort(ran, ran + k,cmp);
dp[] = ;
for (int i = ; i < k; i++) {
int t = ran[i];
memset(used, , sizeof(used));
for (int h = hi[t]; h <= ai[t]; h++) {
//dp[h]==0一定也要记得写,这里也是个贪心
if (dp[h]==&&dp[h - hi[t]] && used[h - hi[t]] + <= ci[t]) {
dp[h] = ; used[h] = used[h - hi[t]] + ;
}
}
}
int ans = ;
for (int i = ; i >= ; i--) if (dp[i]) {
ans = i; break;
}
printf("%d\n", ans);
}
return ;
}

总结:

这题和经典的多重背包问题还是有些差别的:

这题是求给定一系列元素的高度,个数,高度限制,求最大高度。

而经典多重背包问题是给定一系列元素的价值,体积,体积限制,求最大价值。

POJ 2392 Space Elevator 贪心+dp的更多相关文章

  1. POJ 2392 Space Elevator(贪心+多重背包)

    POJ 2392 Space Elevator(贪心+多重背包) http://poj.org/problem?id=2392 题意: 题意:给定n种积木.每种积木都有一个高度h[i],一个数量num ...

  2. poj 2392 Space Elevator(多重背包+先排序)

    Description The cows are going to space! They plan to achieve orbit by building a sort of space elev ...

  3. POJ 2392 Space Elevator(多重背包变形)

    Q: 额外添加了最大高度限制, 需要根据 alt 对数据进行预处理么? A: 是的, 需要根据 alt 对数组排序 Description The cows are going to space! T ...

  4. poj[2392]space elevator

    Description The cows are going to space! They plan to achieve orbit by building a sort of space elev ...

  5. POJ 2392 Space Elevator DP

    该题与POJ 1742的思路基本一致:http://www.cnblogs.com/sevenun/p/5442279.html(多重背包) 题意:给你n个电梯,第i个电梯高h[i],数量有c[i]个 ...

  6. POJ 2392 Space Elevator 背包题解

    多重背包.本题不须要二分优化.相对简单点.由于反复数十分小,小于10. 而添加一个限制每种材料的高度做法.假设使用逆向填表,那么仅仅须要从这个高度往小递归填表就能够了. 还有就是注意要排序,以限制高度 ...

  7. POJ 2392 Space Elevator(多重背包)

    显然塔的总高度不会超过最大的a[i],而a[i]之前的可以到达的高度 是由a值更小的块组成,所以按照a从小到大的顺序去转移. 然后就是多重背包判断存在性了,几乎和coin那题一样. 数据没coin丧病 ...

  8. uva12486 Space Elevator(数位dp)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 题目链接:https://uva.onlinejudge.org/index.ph ...

  9. Space Elevator [POJ2392] [DP][优化]

    题目大意 n件物品,第i件hi高,有ci件,最高的一件不能超过ai的高度.问最高能堆多高 输入: 第一行,一个n 接下来每一行,为hi,ai,ci 输出,最高堆多高 样例输入: 37 40 35 23 ...

随机推荐

  1. urllib库使用方法1 request

    urllib是可以模仿浏览器发送请求的库,Python自带 Python3中urllib分为:urllib.request和urllib.parse import urllib.request url ...

  2. KKT原理以及SVM数学的理论推导分析

    一直很好奇机器学习实战中的SVM优化部分的数学运算式是如何得出的,如何转化成了含有内积的运算式,今天上了一节课有了让我很深的启发,也明白了数学表达式推导的全过程. 对于一个SVM问题,优化的关键在于 ...

  3. EJS 模板中,js 如何获取后端传来的数据

    在 ejs 模板中,想让 js 的代码获得后端传来的数据,要在<%=%>的外面加一对引号. 如下图,从后端给 chatroom.ejs 传进去一个 avatar 变量,是个字符串类型的. ...

  4. 20155215宣言 实验三 敏捷开发与XP实践 实验报告

    实验内容 XP基础 XP核心实践 相关工具 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 2.完成实验.撰写实验报告,实 ...

  5. 20155218 2016-2017-2 《Java程序设计》第9周学习总结

    20155218 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 JDBC全名Java DataBase Connectivity,是java联机数据库的标准 ...

  6. 20155235 《Java程序设计》 实验四 Android开发基础

    20155235 <Java程序设计> 实验四 Android开发基础 实验要求 基于Android Studio开发简单的Android应用并部署测试; 了解Android组件.布局管理 ...

  7. 学习Java的必要知识点记录

    在java中什么是类和对象 在还没有学习java类和对象的时候,基本上都是解决的一些比较简单的小程序,仅仅也就是几十行代码而已,如果要开发的是一个很大的程序,需要用到几万行甚至是几十万行代码的量,如果 ...

  8. 20155316 2016-2017-2 《Java程序设计》第10周学习总结

    教材学习内容总结 Java和Android开发学习指南(第二版)第22章 Java 密码技术 教材学习中的问题和解决过程 1.什么叫柯克霍夫原则? 数据的安全基于密钥而不是算法的保密. 也就是说系统的 ...

  9. 20155328 实验四 Android程序设计 实验报告

    20155328 实验四 Android程序设计 第24章 初识Android 提交点1:完成HelloWorld并显示自己的学号 安装Android Studio后,创建了属于自己的Project( ...

  10. switchsharp

    https://www.switchysharp.com/file/switchysharp-v1.10.4.zip