题干:

The cows are going to space! They plan to achieve orbit by building a sort of space elevator: a giant tower of blocks. They have K (1 <= K <= 400) different types of blocks with which to build the tower. Each block of type i has height h_i (1 <= h_i <= 100) and is available in quantity c_i (1 <= c_i <= 10). Due to possible damage caused by cosmic rays, no part of a block of type i can exceed a maximum altitude a_i (1 <= a_i <= 40000).

Help the cows build the tallest space elevator possible by stacking blocks on top of each other according to the rules.

Input

* Line 1: A single integer, K

* 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

* Line 1: A single integer H, the maximum height of a tower that can be built

Sample Input

3
7 40 3
5 23 8
2 52 6

Sample Output

48

Hint

OUTPUT DETAILS:

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.

题目大意:

给出了一些砖块,砖块有高度,最高可以达到的高度(高度限制)和数量,问最高可以摞多高的塔。

解题报告:

首先按照限制高度排序这点没问题吧。反正我早晚都得排序,还不如先排那些可能被高度限制住的。

我们都知道,多重背包可以转化成0-1背包类模板的问题去求解,也可以转化成完全背包类模板去求解,即,一个是正向遍历,一个是反向遍历(内层循环的时候),

AC代码:(多重背包转完全背包模型去求解,即正向遍历的模型,然后把那些限制都变成一个个的if判断就好了。)

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#define ll long long
using namespace std;
struct Node {int h,a,c;
} node[500];
int dp[40000 + 5];
int sum[40000 + 5];bool cmp(const Node &a,const Node &b) {return a.a<b.a;}
int main()
{int ans = 0;int KK;cin>>KK;//for(int i =1; i<=KK; i++) {scanf("%d%d%d",&node[i].h,&node[i].a,&node[i].c);}sort(node + 1,node+KK+1,cmp);dp[0] = 1;for(int i = 1; i<=KK; i++) {
//        for(int k = 1; k<=node[i].c; k++)
//            for(int j =40000; j>=node[i].a; j--) {
//                dp[j] = max(dp[j])
//            }memset(sum,0,sizeof(sum));//记录当前这个物品在j高度(相当于是体积)for(int j = node[i].h; j <= node[i].a; j++) {if(dp[j] == 0 &&dp[j - node[i].h ] == 1&& sum[j -node[i].h ] + 1 <= node[i].c) {//如果dp[j]当前高度更新过了,那就不再更新,因为我们可以留着这一块砖头放到更高的地方。sum[j ] = sum[j -node[i].h ] + 1;dp[j] = 1;ans = max(ans,j);}}}printf("%d\n",ans);return 0 ;
}

或者:(多重背包转换成0-1背包去求解,b结构体为node这个多重背包的结构体  经过二进制优化后存入的结构体)

注意的就是最后最大高度的dp[node[KK].a ]不一定是最优解

因为这个dp[node[KK].a ]的最值是从上一步过来的

而由于上一步dp的  node[KK].a 更小,因此dp数组存在断档

所以要最后从头扫一遍才能得出最优解,或者直接在线维护一个maxx就可以了

 sort(b+1,b+p,cmp);int maxx = 0;for(int i=1;i<p;++i){for(int j=b[i].a;j>=b[i].h;--j){  //背包容量从cost开始才有效dp[j] = max(dp[j],dp[j-b[i].h]+b[i].h); maxx = max(maxx,dp[j]);}}cout<<mmax<<endl;

【POJ - 2392】Space Elevator (dp,优秀的背包问题)相关推荐

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

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

  2. poj 2392 Space Elevator

    题意 :给定n种积木,每种积木都有一个高度hi,一个数量ci,还有一个限制条件,这个积木所在的位置不能高于ai,问能叠起的最大高度// 这里有个问题需要注意 就是ai小的要先进行背包 不然 在 ai高 ...

  3. P6771 [USACO05MAR]Space Elevator 太空电梯-贪心与DP

    题目链接[USACO05MAR]Space Elevator 太空电梯 - 洛谷 题目描述 奶牛们要去太空了!它们打算用方块建造一座太空电梯.现在它们有 NN 种方块,第 ii 种方块有一个特定的高度 ...

  4. [背包DP]Space Elevator 太空电梯

    [背包DP]Space Elevator 太空电梯 题面 题目描述 输入 输出 样例 解析 代码 题面 题目描述 奶牛们要去太空了!它们打算用方块建造一座太空电梯.现在它们有 NN 种方块,第 ii ...

  5. POJ 3466 带限制的 0 1背包问题

    POJ 3466 带限制的 0 1背包问题 题目链接 分析如下: 由于必须要 超过 q 值才能购买,而无论是一维还是二维普通 000 111 背包问题,它后一个的值都需要用到上一个的值. 比如: 我们 ...

  6. P6771 [USACO05MAR]Space Elevator 太空电梯 题解

    [USACO05MAR]Space Elevator 太空电梯 description: 奶牛们要去太空了!它们打算用方块建造一座太空电梯.现在它们有 种方块,第 种方块有一个特定的高度 ,一定的数量 ...

  7. POJ 1696 Space Ant(极角排序)【计算几何】

    ACM博客_kuangbin POJ 1696 Space Ant(极角排序) Space Ant Time Limit: 1000MS   Memory Limit: 10000K Total Su ...

  8. poj 2392 dp 不是很懂哎!!!Space Elevator

    大意:有K种block去建塔,每种每个都有一个高度H,用了当前的block塔的高度不能超出a,和每种的数量.求塔最高能建多高. 分析:这题就是一个多重背包,但有一点变动,必须先以a从小到大排序,因为如 ...

  9. poj 1185(状压dp)

    题目链接:http://poj.org/problem?id=1185 思路:状态压缩经典题目,dp[i][j][k]表示第i行状态为j,(i-1)行状态为k时最多可以放置的士兵个数,于是我们可以得到 ...

最新文章

  1. C++ 笔记(04)— 数据类型(各类型占用内存 sizeof、typedef 声明)
  2. QT:(1)QT下载地址
  3. vue-cli构建项目
  4. 062_JavaScript异常
  5. 二阶振荡环节的谐振频率_晶体振荡器和谐振器的区别 555压控振荡器电路图
  6. 屏幕阅读器安全吗_如何为屏幕阅读器设计网站布局
  7. matlab jar包,Matlab 將m文件打包成jar包 (二)使用jar包
  8. Python(七)Socket编程、IO多路复用、SocketServer
  9. AERONET数据产品介绍
  10. iOS开发-简单图片背景替换 实现抠图效果
  11. js生成相近色颜色RGB代码
  12. raw图的存储格式和读取方式
  13. FE!FE!面板固定效应模型:你用对了吗
  14. MPchart使用详解及详细属性(一)
  15. 淘宝api开发教程(淘宝API测试地址,参数说明)
  16. 想知道如何批量旋转图片?只要学会这两招就可以
  17. 20211217使用python3通过最近6期的双色球开奖结果预测新一期的号码
  18. 干货 | 万字长文详解携程酒店订单缓存 存储系统升级实践
  19. 《炬丰科技-半导体工艺》--技术资料合集24
  20. 正向代理与反向代理通俗理解

热门文章

  1. [剑指offer]面试题第[44]题[JAVA][数字序列中某一位的数字][找规律]
  2. Java学习笔记7-1——注解与反射
  3. android 平板方案,Android平板方案
  4. 小程序开发语言python_小程序是用什么语言开发的?5种最佳语言分享
  5. AlarmManager使用
  6. mysql视图表修复_mysql中含有视图数据库在恢复数据时视图变成数据表的解决方法...
  7. php模板初级教程,风格模板初级不完全修改教程
  8. python 连接oracle_常用的Python库,给大家分享一下!
  9. 大连理工优化方法matlab,大连理工大学2016年秋季优化方法大作业.pdf
  10. mysql 载入主体时出错_mysql遇到load data导入文件数据出现1290错误的解决方案