博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 2392 Space Elevator(dp 排序+多重背包)
阅读量:4072 次
发布时间:2019-05-25

本文共 1358 字,大约阅读时间需要 4 分钟。

题目:

题目大意:

有n种砖头,每种砖头的高为h,数量为c, 且它放的最高位置不能超过a。 问这些砖最高能够叠多高?

思路:

先把所有种类砖头按照a从大到小排序,然后直接套多重背包即可。

代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MP make_pair#define SQ(x) ((x)*(x))#define MAX(x, y) ((x)>(y))?(x):(y)typedef int int64;const double PI = acos(-1.0);const int INF = 0x3f3f3f3f;using namespace std;const int MAXN = 33;int n, m;struct Node{ int h, a, c; bool operator<(const Node& rhs)const { return a < rhs.a; }}arr[410];inline void ZeroOnePack(int* f, int V, int c, int w){ for(int i=V; i>=c; --i) f[i] = max(f[i], f[i-c]+w);}inline void CompletePack(int* f, int V, int c, int w){ for(int i=c; i<=V; ++i) f[i] = max(f[i], f[i-c]+w);}inline void MultiplePack(int* f, int V, int c, int w, int m){ if(c*m >= V){ CompletePack(f, V, c, w); return ; } int k = 1; while(k < m){ ZeroOnePack(f, V, k*c, k*w); m -= k; k <<= 1; } ZeroOnePack(f, V, m*c, m*w);}int f[100010];int main(){ scanf("%d", &n); int maxx = 0; for(int i=1; i<=n; ++i){ scanf("%d%d%d", &arr[i].h,&arr[i].a,&arr[i].c); maxx = max(maxx, arr[i].a); } sort(arr+1, arr+1+n); for(int i=0; i<=maxx; ++i) f[i] = 0; for(int i=1; i<=n; ++i) MultiplePack(f, arr[i].a, arr[i].h, arr[i].h, arr[i].c); int ans = 0; for(int i=0; i<=maxx; ++i) ans = max(ans, f[i]); printf("%d\n", ans); return 0;}

转载地址:http://yvzni.baihongyu.com/

你可能感兴趣的文章
几个常用的Javascript字符串处理函数 spilt(),join(),substring()和indexof()
查看>>
javascript传参字符串 与引号的嵌套调用
查看>>
swiper插件的的使用
查看>>
layui插件的使用
查看>>
JS牛客网编译环境的使用
查看>>
9、VUE面经
查看>>
Golang 数据可视化利器 go-echarts ,实际使用
查看>>
mysql 跨机器查询,使用dblink
查看>>
mysql5.6.34 升级到mysql5.7.32
查看>>
dba 常用查询
查看>>
Oracle 异机恢复
查看>>
Oracle 12C DG 搭建(RAC-RAC/RAC-单机)
查看>>
Truncate 表之恢复
查看>>
Oracle DG failover 后恢复
查看>>
为什么很多程序员都选择跳槽?
查看>>
mongdb介绍
查看>>
Yotta企业云盘助力科技行业创高峰
查看>>
Yotta企业云盘更好地为教育行业服务
查看>>
Yotta企业云盘怎么帮助到能源化工行业
查看>>
企业云盘如何助力商业新发展
查看>>