Space Elevator [POJ2392] [DP][优化]
题目大意
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][优化]的更多相关文章
- uva12486 Space Elevator(数位dp)
		
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud 题目链接:https://uva.onlinejudge.org/index.ph ...
 - POJ 2392 Space Elevator 贪心+dp
		
题目链接: http://poj.org/problem?id=2392 题意: 给你k类方块,每类方块ci个,每类方块的高度为hi,现在要报所有的方块叠在一起,每类方块的任何一个部分都不能出现在ai ...
 - poj2392 Space Elevator(多重背包问题)
		
Space Elevator Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8569 Accepted: 4052 ...
 - POJ2392:Space Elevator
		
Space Elevator Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9244 Accepted: 4388 De ...
 - POJ 2392 Space Elevator(多重背包变形)
		
Q: 额外添加了最大高度限制, 需要根据 alt 对数据进行预处理么? A: 是的, 需要根据 alt 对数组排序 Description The cows are going to space! T ...
 - poj 2392 Space Elevator(多重背包+先排序)
		
Description The cows are going to space! They plan to achieve orbit by building a sort of space elev ...
 - A - Space Elevator(动态规划专项)
		
A - Space Elevator Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u ...
 - POJ 2392 Space Elevator(贪心+多重背包)
		
POJ 2392 Space Elevator(贪心+多重背包) http://poj.org/problem?id=2392 题意: 题意:给定n种积木.每种积木都有一个高度h[i],一个数量num ...
 - poj[2392]space elevator
		
Description The cows are going to space! They plan to achieve orbit by building a sort of space elev ...
 
随机推荐
- file按钮美化成图片(纯HTML+CSS)
			
效果图: 代码实现: html: <div> <h2>上传头像</h2> <p class="fs18">(请上传200X200px ...
 - php归档格式:phar文件详解(创建、使用、解包还原提取)
			
转载一篇,突然遇到一个冷知识,phar的东东,貌似和jar.war是一种鬼. 重点使用一下下面这个东东,就能解包出来东东了. $phar = new Phar('lib/yunke.phar', 0) ...
 - [转] babel 教程
			
在前端开发领域,浏览器兼容性问题从来不曾消失.除了 CSS,我们还要面对 JavaScript 的兼容性问题. 不同的浏览器讲着不同的 JavaScript 语言,不同的浏览器版本同样讲着不同的 Ja ...
 - webstorm我用到的快捷键【不断更新】
			
alt+insert:新建一个文件或其他 ctrl+shift+l:代码格式化 [可能会和qq的锁屏键冲突] ctrl+shift+r:批量查找替换 多点编辑:按住alt键选择多列,就可以编辑多行了 ...
 - [转]MySQL 数据类型(float)的注意事项
			
http://www.cnblogs.com/zhoujinyi/archive/2013/04/26/3043160.html 可能由于版本关系,我的mysql5.7插入数据超过范围时会提示,126 ...
 - 【Ruby】Mac  gem的一些坑
			
前言 自上一次升级MacOS系统后出现jekyll无法构建的问题,当时处理半天.谁知道最近又升级了MacOS,荒废博客多时,今天吝啬写了一篇准备发布,构建报错,问题重新.还是记录下,以防下次升级出问题 ...
 - python全栈开发day62-两表操作增删改查,外键,if else模板语法
			
一.今日内容总结: day62 内容回顾: 1. django有关所有命令: pip install django==1.11.14 django-admin startproject 项目名称 cd ...
 - net core体系-web应用程序-4net core2.0大白话带你入门-2asp.net core新建项目
			
新建asp.net core项目 开发环境:Windows Server R2 2008 开发工具:Microsoft Visual Studio 2017 新建asp.net core项目 创建 ...
 - pycharm中出现的错误
			
错误1 在pycharm上安装TensorFlow运行import tensorflow时报错: File , in _find_and_load SystemError: PyEval_EvalFr ...
 - oracle中查找某用户执行某张表的操作操作记录
			
转载:http://www.cnblogs.com/nizuimeiabc1/p/9441937.html 1,首先查找表的操作记录 select * from v$sqlarea a where a ...