POJ 2392 Space Elevator(贪心+多重背包)
POJ 2392 Space Elevator(贪心+多重背包)
http://poj.org/problem?id=2392
题意:
题意:给定n种积木。每种积木都有一个高度h[i],一个数量num[i]。另一个限制条件,这个积木所在的位置不能高于limit[i],问能叠起的最大高度?
分析:
本题是一道多重背包问题, 只是每一个物品的选择不只要受该种物品的数量num[i]限制, 且该物品还受到limit[i]的限制.
这里有一个贪心的结论:
我们每次背包选取物品时都应该优先放置当前limit[i]值最小的积木(能够画个图看看,只是不太好证明该结论). 所以我们首先把全部积木按limit[i]的值进行从小到大的排序, 然后从1编号開始选积木就可以.
以下就是多重背包的过程了.
令dp[i][j]==x表示用前i个积木且总的高度<=j时能达到的最大高度为x.
初始化: dp全为0.
对于每种物品, 我们要做两种选择:
1. num[i]*high[i]>=limit[i]时, 做一次全然背包.
2. Num[i]*high[i]<limit[i]时, 须要把当前物品再分类, 然后做多次01背包就可以.
终于所求: dp[n][j]的最大值. 当中j遍历[0,limit[n]]内全部数.
注意: 本来按道理dp[i][j]的语义是<=j时, 而不是正好等于j时. 我们直接输出dp[n][limit[n]]就可以的. 可是本题有点特殊. 看以下这组数据:
2
5 11 3
8 12 2
相应的终于dp输出为:
i=0 dp[i]=0
i=1 dp[i]=0
i=2 dp[i]=0
i=3 dp[i]=0
i=4 dp[i]=0
i=5 dp[i]=5
i=6 dp[i]=5
i=7 dp[i]=5
i=8 dp[i]=8
i=9 dp[i]=8
i=10 dp[i]=10
i=11 dp[i]=10
i=12 dp[i]=8
为什么会得到上面奇怪的数据呢?
由于当选择第1个物品(high[1]==5)时, 进行的背包过程仅仅做到了11高度就停了, 没有继续到全部数据. 所以终于须要遍历全部dp数据.
AC代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=40000+5; int n;//木块种类
struct Node//每种木块
{
int high,num,limit;
bool operator<(const Node &rhs)const
{
return limit<rhs.limit;
}
}nodes[400+5];
int dp[maxn]; //一次01背包过程
void ZERO_ONE_PACK(int cost,int limit)
{
for(int i=limit;i>=cost;i--)
dp[i] = max(dp[i], dp[i-cost]+cost);
} //一次全然背包过程
void COMPLETE_PACK(int cost,int limit)
{
for(int i=cost;i<=limit;i++)
dp[i] = max(dp[i], dp[i-cost]+cost);
} //一次多重背包过程
void MULTIPLY_PACK(int cost,int limit,int num)
{
if(cost*num>=limit)
{
COMPLETE_PACK(cost,limit);
return ;
} int k=1;
while(k<num)
{
ZERO_ONE_PACK(cost*k,limit);
num-=k;
k*=2;
}
ZERO_ONE_PACK(cost*num,limit);
} int main()
{
while(scanf("%d",&n)==1)
{
//读取输入+排序
for(int i=1;i<=n;i++)
scanf("%d%d%d",&nodes[i].high,&nodes[i].limit,&nodes[i].num);
sort(nodes+1,nodes+n+1); //初始化dp+递推
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
MULTIPLY_PACK(nodes[i].high, nodes[i].limit, nodes[i].num); //统计结果输出
int ans=0;
for(int i=0;i<=nodes[n].limit;i++)
ans=max(ans,dp[i]);
printf("%d\n",ans);
}
return 0;
}
POJ 2392 Space Elevator(贪心+多重背包)的更多相关文章
- POJ 2392 Space Elevator(多重背包)
显然塔的总高度不会超过最大的a[i],而a[i]之前的可以到达的高度 是由a值更小的块组成,所以按照a从小到大的顺序去转移. 然后就是多重背包判断存在性了,几乎和coin那题一样. 数据没coin丧病 ...
- POJ 2392 Space Elevator 贪心+dp
题目链接: http://poj.org/problem?id=2392 题意: 给你k类方块,每类方块ci个,每类方块的高度为hi,现在要报所有的方块叠在一起,每类方块的任何一个部分都不能出现在ai ...
- 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 ...
- POJ 2392 Space Elevator 背包题解
多重背包.本题不须要二分优化.相对简单点.由于反复数十分小,小于10. 而添加一个限制每种材料的高度做法.假设使用逆向填表,那么仅仅须要从这个高度往小递归填表就能够了. 还有就是注意要排序,以限制高度 ...
- poj[2392]space elevator
Description The cows are going to space! They plan to achieve orbit by building a sort of space elev ...
- POJ 2392 Space Elevator DP
该题与POJ 1742的思路基本一致:http://www.cnblogs.com/sevenun/p/5442279.html(多重背包) 题意:给你n个电梯,第i个电梯高h[i],数量有c[i]个 ...
- poj 2392 建塔(多重背包+不定上界)
http://blog.csdn.net/libin56842/article/details/9492351 这次比较理解那个!dp[j]是为了什么,因为是滚动数组,没有这个的话used那边会出问题 ...
- POJ 3260 The Fewest Coins(多重背包+全然背包)
POJ 3260 The Fewest Coins(多重背包+全然背包) http://poj.org/problem?id=3260 题意: John要去买价值为m的商品. 如今的货币系统有n种货币 ...
随机推荐
- 使用 URLDecoder 和 URLEncoder 对统一认证中的http地址转义字符进行处理
import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; ...
- 高速备份还原MYSQL数据库
#安装依赖包yum -y update gccyum -y install gcc+ gcc-c++ #安装cd /usr/local/softwaretar -jxvf p7zip_16.02_sr ...
- Qt笔记——入门
Qt的介绍 跨平台c++图形用户界面应用程序框架 Qt的框架 父类(基类)子类(派生类) 头文件 QApplication应用程序类 Qt头文件没有.h 头文件和类名一样 有且只有一个应用程序类的对象 ...
- 5分钟在Mac上从0配置安装laravel5.5
1.安装包管理工具homebrew ,相当于ubuntu的apt-get 在iTerm命令行输入: /usr/bin/ruby -e "$(curl -fsSL https://raw.gi ...
- C# 调试程序时如何输入命令行参数
调试程序时如何输入命令行参数http://www.a769.com/archives/320.html 开发命令行程序时,我们会疑惑,从那里输入参数呢?请看下面的教程,让你摆脱困扰. 1.点击菜单栏: ...
- React Native - 1 Windows下的环境配置(Windows+Android)
参考:https://facebook.github.io/react-native/docs/getting-started.html(要FQ) 网站上建议使用Chocolatey去配环境, ...
- 好的web前端是如何拿到30万年薪的?
2018年前端开发不再像过去几年里新技术框架层出不穷,而是各种组件,模块,很多东西都有痕迹可寻,技术都在原来的基础上有了革新和沉淀. 前端招聘方面也在紧跟技术发展,大量“滥竽充数”的速成开发者开始失去 ...
- java 时间格式化中的模式字母
java日期格式化中的模式字母有特定的意义,由于没有注意,今天在做工程的时候导致出现了奇怪的日期: 错误写法如下: 然而得到了错误的结果: 正确写法如下: 这样就得到了正确的结果 mm指的是分钟,MM ...
- HYSBZ - 2038 小Z的袜子 (莫队算法)
A1206. 小Z的袜子 时间限制:1.0s 内存限制:512.0MB 总提交次数:744 AC次数:210 平均分:44.44 将本题分享到: 查看未格式化的试题 ...
- 选择快速源来加速linux系统更新
sudo pacman-mirrors -c China -g 引用自manjaro百度贴吧