多重背包。本题不须要二分优化。相对简单点。由于反复数十分小,小于10。

而添加一个限制每种材料的高度做法。假设使用逆向填表,那么仅仅须要从这个高度往小递归填表就能够了。

还有就是注意要排序,以限制高度为标准从小到大排序。否则答案错误的。

#include <stdio.h>
#include <string.h>
#include <algorithm>
using std::sort; const int MAX_K = 401;
const int MAX_H = 40001;
struct HCA
{
int h, a, c;
bool operator<(const HCA &hac)
{
return a < hac.a;
}
};
HCA hca[MAX_K];
bool tbl[MAX_H]; inline int max(int a, int b) { return a > b ? a : b; } int bagDP(int B)
{
memset(tbl, 0, sizeof(tbl));
tbl[0] = true;
for (int i = 1; i <= B; i++)
{
int k = 1;
for ( ; (k << 1) <= hca[i].c; k <<= 1)
{
for (int j = hca[i].a; j >= hca[i].h*k; j--)
if (tbl[j-hca[i].h*k]) tbl[j] = true;
}
k = hca[i].c - k + 1;
for (int j = hca[i].a; j >= hca[i].h*k; j--)
if (tbl[j-hca[i].h*k]) tbl[j] = true;
}
int i = MAX_H - 1;
for (; i > 0 && !tbl[i]; i--);
return i;
} int main()
{
int blocks;
scanf("%d", &blocks);
for (int i = 1; i <= blocks; i++)
{
scanf("%d %d %d", &hca[i].h, &hca[i].a, &hca[i].c);
}
sort(hca, hca+blocks+1);
printf("%d\n", bagDP(blocks));
return 0;
}

POJ 2392 Space Elevator 背包题解的更多相关文章

  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(多重背包)

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

  6. POJ 2392 Space Elevator 贪心+dp

    题目链接: http://poj.org/problem?id=2392 题意: 给你k类方块,每类方块ci个,每类方块的高度为hi,现在要报所有的方块叠在一起,每类方块的任何一个部分都不能出现在ai ...

  7. POJ 2392 Space Elevator DP

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

  8. POJ 3211 Washing Clothes 背包题解

    本题是背包问题,可是须要转化成背包的. 由于是两个人洗衣服,那么就是说一个人仅仅须要洗一半就能够了,由于不能两个人同一时候洗一件衣服,所以就成了01背包问题了. 思路: 1 计算洗完同一颜色的衣服须要 ...

  9. POJ 2392【多重背包】

    题意: k个块,给出每个块的高度hi,数量ci,不能超过的高度: 求这些块可以组成的最大高度一个. 思路: 大致可看这个题是一个背包,背包的承重是高度. 对于每个物品,有他的价值是高度,还有限定的数量 ...

随机推荐

  1. [ES6] Promise

    How to use: export default function getReplies(topicId){ return new Promise(function( resolve, rejec ...

  2. Qt Creator实现状态栏显示

    在程序主窗口Mainwindow中,有菜单栏,工具栏,中心部件和状态栏.前面几个已经讲过了,这次讲解状态栏的使用. 程序中有哪些不明白的类或函数,请自己查看帮助. 1.我们在mainwindow.h中 ...

  3. Qt QString to char*

    QString转换成char * 的时候,一定要定义一个QBateArray的变量.不能连写 How can I convert a QString to char* and vice versa ? ...

  4. eclipse打包 jar文件,中文乱码解决方案

    直接通过eclipse浏览源代码时,发现中文注释为乱码的问题.其实这个eclipse默认编码造成的问题.可以通过以下方法解决: 修改Eclipse中文本文件的默认编码:windows->Pref ...

  5. 使用VS Code开发Angular 2应用程序所需配置文件的解析

    目录 package.json typings.json tsconfig.json launch.json settings.json tasks.json package.json: 这是项目的基 ...

  6. 解决VS2008闪退的问题

    问题:打开VS2008项目后,应该是加载完所有文件,立即断掉了IDE,查看事件器,发现图片中的错误描述,google了很久没有找到解决方案,后来还是自己动手解决这个问题花了一早上的时间,哎,只要把工程 ...

  7. js中substring/substr和C#中Substring的用法

    一:在js中截取字符串的方法有两个:substring和substr 1.方法: substring(int stringIndex,[int endIndex]) 截取从索引为stringIndex ...

  8. MySql多条SQL语句的批量处理

    pstmt= conn.prepareStatement(sql); for(int i=0;i<500;i++) { //准备sql语句 pstmt.setString(1, "tt ...

  9. 简单实用 “易忘” 的SQL 语句语法,新老皆宜

    --创建数据库 create database 数据库名 on primary ( name='数据库名_data',  filename='数据库储存路径', size=数据库初始大小(MB),   ...

  10. POJ2406 KMP算法

    POJ2406 问题重述:给定字符串s0,记连续的k个s前后相连组成的s0s0...s0为s0^k.输入字符串S,求最大的k,使得S = s0^k. 问题分析: 1.采用kmp算法求出前缀函数 pre ...