POJ 2392 Space Elevator 背包题解
2016-03-09 21:51
288 查看
多重背包。本题不须要二分优化。相对简单点。由于反复数十分小,小于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; }
相关文章推荐
- 一致性哈希算法(consistent hashing)(转)
- Atitit.木马病毒自动启动-------------win7计划任务的管理
- bzoj2456 mode 有点思考难度
- LightOJ 1245 - Harmonic Number (II) (求n/1+n/2+n/2+....+n/n)
- java线程5 volatile和synchronized关键字 .
- 异步通知与异步I/O
- 反转链表
- POJ 2533
- BZOJ-2049 Cave洞穴勘测 动态树Link-Cut-Tree (并查集骗分TAT)
- Atitit.木马病毒自动启动-------------win7计划任务的管理
- 程序员面试金典(排序与查找):变位词排序(java解法)
- 痛苦的并行之路----MATLAB工具箱安装
- mysql-5.7.11-winx64.zip的解压缩安装
- C#使用linq to xml完成对XML文件的创建、增加、删除、修改、查询
- 证书问题、刷新自定义view实例
- 如何使用redis做mysql的缓存
- BZOJ-2049 Cave洞穴勘测 动态树Link-Cut-Tree (并查集骗分TAT)
- Atitit.木马病毒自动启动-------------win7计划任务的管理
- 多线程
- centos 升级php、mysql(webtatic)