pojnbsp;2392nbsp;Spacenbsp;Elevatornbsp;背包
这个题目本质上是一个多重背包
但是有一个限制条件,就是每个物品堆放的高度都有一个最大值,不能超过
刚开始被这个条件吓到了,考虑到用搜索的做法,但是400件物品,搜索无法承受
就又回到dp上面,其实贪心的思想就可以保证最优,那些堆放高度限制低的物品一定是放在底下的
所以先按堆放高度限制升序排序,然后就可以上多重背包了
多重背包的解法:用二进制的思想来拆分物品,使之转化成01背包
#include
#include
#include
using namespace std;
int a[4001][2],lon=0;
int ans[400001];
int max(int a,int b)
{
if(a>b) return(a);
return(b);
}
int min(int a,int b)
{
if(a
return(b);
}
int main()
{
int k;
scanf("%d",&k);
for(int i=1;i<=k;i++)
{
int h,l,c;
scanf("%d %d %d",&h,&l,&c);
int tmp=1;
while(tmp<=c)
{
c-=tmp;
a[++lon][0]=tmp*h;
a[lon][1]=l;
tmp*=2;
}
if(c)
{
a[++lon][0]=c*h;
a[lon][1]=l;
}
}
// for(int i=1;i<=lon;i++)
// printf("%d %d\n",a[i][0],a[i][1]);
for(int i=1;i<=lon;i++)
for(int j=lon;j>=i+1;j--)
if(a[j][1]
{
int tmp=a[j-1][0];
a[j-1][0]=a[j][0];
a[j][0]=tmp;
tmp=a[j-1][1];
a[j-1][1]=a[j][1];
a[j][1]=tmp;
}
memset(ans,0,sizeof(ans));
ans[0]=1;
int lonh=0;
for(int i=1;i<=lon;i++)
{
for(int j=min(lonh,a[i][1]-a[i][0]);j>=0;j--)
if(ans[j])
{
// printf("%d %d\n",j+a[i][0],a[i][0]);
ans[j+a[i][0]]=1;
lonh=max(j+a[i][0],lonh);
}
}
for(int i=400001;i>=0;i--)
if(ans[i])
{
printf("%d\n",i);
break;
}
return 0;
}
pojnbsp;2392nbsp;Spacenbsp;Elevatornbsp;背包相关推荐
- HDU 1248 寒冰王座(全然背包:入门题)
HDU 1248 寒冰王座(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid=1248 题意: 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票 ...
- 单调队列多重背包时间复杂度O(vn)
版权声明:本文为博主原创文章,未经博主允许不得转载. 多重背包问题: 有N种物品和容量为V的背包,若第i种物品,容量为v[i],价值为w[i],共有n[i]件.怎样装才能使背包内的物品总价值最大? 网 ...
- 浅说——九讲背包之01背包
所谓九讲,也就是: 0/1背包 0/1背包降维 完全背包 多重背包(二进制优化) 混合背包 二维费用背包 分组背包 有依赖的背包 背包的方案总数\背包的具体方案路径 0/1背包: [问题描述](经典) ...
- codevs——2894 Txx考试(背包)
时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description Txx是一个成绩很差的人,考试便成了他的噩梦.于是他常在考试时睡觉以打发时间.今 ...
- Codeforces Round #104 (Div. 2) E DP(01背包模型) +组和+除法取模求逆元
题意: 规定只包含4或7的数为幸运数字,给定n个数的序列,求他的子序列,使得该子序列的长度为k并且满足该子序列中不存在相同的两个幸运数字.问一共寻在多少种可能.(只要该数的下标不同则认为是不同的序列) ...
- HDU-1203 I NEED A OFFER!-0、1背包及空间优化
I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 0-1背包使用一维dp数组时为何v要从大到小枚举
样例数据 5 8 3 5 1 2 2 4 5 2 1 3 如若不然,也就是让v按照从小到大的顺序枚举,就会出现 注意高亮的那一行,第一件物品的重量只有3,怎么会得到6呢? 代码如下 #include& ...
- poj 2063完全背包
题意:给出总资金和投资年份 ,n个股票 给出股票价格和其一年的利润.问如何选择能获得最大利润. 思路:股票可以重复选择,完全背包问题,完全背包也是从01背包衍生而行的,其主要区别在于中间那层循环的次序 ...
- codechef ANUCBC(背包)
题目链接: https://www.codechef.com/problems/ANUCBC 按模数进行背包 取模不要直接取,分开写,不然会T #include<cstdio> #incl ...
最新文章
- 内核函数输出怎么看到_谈谈如何学习Linux内核
- 显示乱七八糟图片问题之解决
- CGI,BOA配置心得
- python内置函数——sorted、filter、map、format
- 腾讯首位T17级科学家诞生!
- MySQL-InnoDB引擎
- mysql md5版本校验_MySQL查询以名称的md5版本更新所有条目?
- 【Java】关键词assert的使用
- 5月22日晚间,阿里巴巴集团发布2020财年业绩……
- 遍历列表python_python中列表的遍历
- redis的简单安装和配置文件的参数
- Oracle 12导出、导入数据
- halcon学习笔记——(6)单摄像机标定
- Tomcat乱码解决方法
- 机器学习----高斯过程回归
- 折腾笔记-做网线+二层傻瓜交换机部署
- 典型C内存空间分布图
- excel下拉让函数参数部分不变
- html设置长宽高代码_html设置高等于宽
- Eureka健康检查