题目大意

n件物品,第i件hi高,有ci件,最高的一件不能超过ai的高度。问最高能堆多高

输入:

第一行,一个n

接下来每一行,为hi,ai,ci

输出,最高堆多高

样例输入:

3
7 40 3
5 23 8
2 52 6

样例输出:

48 (从下到上:3个2号,3个1号,6个3号)

分析:

我们很容易想到要先放限制高度小的,那我们就先按限制高度从小到大排序。

然后我们可以发现,这个和多重背包很像,“物重”“价值”都为hi,数量为ci

设dp[i][j]为用前i件,花费高度j的盒子,最高能堆多高(显然dp[][j]=j/0)。

那么状态转移方程为dp[i][j]=max{dp[i-1][j-k*hi]+hi*k}其中限制条件是(dp[i-1][j-k*hi]!=0或j==k*hi )

但我们发现这个复杂度是不优秀的,我们需要降复杂度。

以下是优化方法{

我们知道,0/1背包和完全背包只需要改变循环方向就行了。

而完全背包从小到大循环就是保证了在更新了标号小的后,计算标号大的时候利用小的就可以使用更新后的值,从而实现“物品无限”。

而我们多重背包是有限的个数,如何在完全背包上动点手脚?

我们在dp[j]相对记录一个usd[j]表示已经用了这个物品几次了。

在保证条件dp[j-hi]!=0或j==hi 和dp[j-hi]+hi>dp[j]时

还需满足usd[j-hi]+1<=ci,再把usd[j]更新成usd[j-hi]+1,这样就能保证该物品使用次数小于等于ci。

最后输出结果小心坑,找到第一个dp[i]不等于0,输出;特判ans==0的情况

代码:

 #include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define RG register int
#define rep(i,a,b) for(RG i=a;i<=b;++i)
#define per(i,a,b) for(RG i=a;i>=b;--i)
#define ll long long
#define inf (1<<29)
#define maxn 405
#define maxm 40005
using namespace std;
int n;
int dp[maxm],usd[maxm];
struct Dat{
int w,a,c;
inline int operator < (const Dat &tt)const{
return a<tt.a;
}
}p[maxn];
inline int read()
{
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int main()
{
n=read();
int mx=;
rep(i,,n) p[i].w=read(),p[i].a=read(),p[i].c=read();
sort(p+,p++n);
rep(i,,n)
{
memset(usd,,sizeof(usd));
rep(j,p[i].w,p[i].a)
if((j==p[i].w||dp[j-p[i].w]) && dp[j-p[i].w]+p[i].w>dp[j] && usd[j-p[i].w]+<=p[i].c)
dp[j]=dp[j-p[i].w]+p[i].w,
usd[j]=usd[j-p[i].w]+;
}
per(i,p[n].a,) if(dp[i]){cout<<dp[i];return ;}
puts("");
return ;
}

Space Elevator [POJ2392] [DP][优化]的更多相关文章

  1. uva12486 Space Elevator(数位dp)

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

  2. POJ 2392 Space Elevator 贪心+dp

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

  3. poj2392 Space Elevator(多重背包问题)

    Space Elevator   Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8569   Accepted: 4052 ...

  4. POJ2392:Space Elevator

    Space Elevator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9244   Accepted: 4388 De ...

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

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

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

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

  7. A - Space Elevator(动态规划专项)

    A - Space Elevator Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u ...

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

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

  9. poj[2392]space elevator

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

随机推荐

  1. python之ORM操作

    1. SQLalchemy简介 SQLAlchemy是一个开源的SQL工具包,基本Python编程语言的MIT许可证而发布的对象关系映射器.SQLAlchemy提供了“一个熟知的企业级全套持久性模式, ...

  2. 20165206 2017-2018-2 《Java程序设计》第七周学习总结

    20165206 2017-2018-2 <Java程序设计>第七周学习总结 教材学习内容总结 MySqL:是世界上最流行的开源数据管理系统. 配置启动MySQL. 连接数据库:Conne ...

  3. 在Git.oschina.net中配置TortoiseGit使用sshkey,无需输入账号和密码

    ssh的方式 git@oschina.com:用户名/版本库t.git           此篇文章针对于这种 黄海正在开发的项目位置 https://gitee.com/dslx/BigData.g ...

  4. springcloud feign传输List的坑

    无法直接传输List 错误方法1: @RequestMapping(value = "/stat/merchant/get_merchant_compare_info", meth ...

  5. (6).NET CORE微服务 Micro-Service ---- AOP框架

    AOP 框架基础 要求懂的知识:AOP.Filter.反射(Attribute). 如果直接使用 Polly,那么就会造成业务代码中混杂大量的业务无关代码.我们使用 AOP (如果不了解 AOP,请自 ...

  6. sdoi2017苹果树

    题解: 非常奇妙的一题.. 没有免费操作我都不会$nk$....考试打个暴力就可以走人了 树上有依赖背包问题的正确做法是(为啥我之前学的不是这样的啊) 按照后续遍历做背包 做到一个点的时候 枚举它选不 ...

  7. [转]xshell使用技巧

    https://yq.aliyun.com/articles/44721 xshell是我用过的最好用的ssh客户端工具,没有之一.这个软件完全免费,简单易用,可以满足通过ssh管理linux vps ...

  8. Bean Shell常用内置变量总结

    JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下: log:写入信息到jmeber.log文件,使用方法:log.info( ...

  9. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-6项目缓冲方案

    Asp.Net Core2.0下使用memcached缓存. Memcached目前微软暂未支持,暂只支持Redis,由于项目历史原因,先用博客园开源项目EnyimMemcachedCore,后续用到 ...

  10. Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第九集-补充-之安装jdk】

    1,安装JDK,本来想安装jdk8的,但是考虑到tomcat安装的是tomcat7,怕出现版本不兼容的情况,就改安装jdk7 去官网下载jdk-7u80-linux-x64.tar.gz的二进制文件, ...