BZOJ 3717: [PA2014]Pakowanie 状压dp
3717: [PA2014]Pakowanie
Time Limit: 90 Sec Memory Limit: 256 MB
Submit: 300 Solved: 103
[Submit][Status][Discuss]
Description
你有n个物品和m个包。物品有重量,且不可被分割;包也有各自的容量。要把所有物品装入包中,至少需要几个包?
Input
第一行两个整数n,m(1<=n<=24,1<=m<=100),表示物品和包的数量。
第二行有n个整数a[1],a[2],…,a[n](1<=a[i]<=10^8),分别表示物品的重量。
第三行有m个整数c[1],c[2],…,c[m](1<=c[i]<=10^8),分别表示包的容量。
Output
如果能够装下,输出一个整数表示最少使用包的数目。若不能全部装下,则输出NIE。
Sample Input
4 2 10 3
11 18 9
Sample Output
这似乎是一道显然的状压(
用 f[s] 表示放入状态为 s 的物品最少几个包
g[s] 表示放入状态为 s 的物品剩余容量最大的包有多少容量
至于那个lowbit优化常数 倒也算常见了
不过 这道题的收获应该不止于此
BJ在做这道题的时候一眼秒掉正解
然而迅速说服了自己 这个解是错误的 /捂脸熊
那么这里的思想偏差在哪里呢?
因为BJ觉得只维护剩余容量最大的不行 得维护每一个剩余的容量 之后就不可做了
// 之后傻瓜BJ还试图子集dp
然而 只维护一个是可行的
我们每次只会考虑放进一个物品
它显然只会由 bit(s) 个状态转移而来
每次放进的这个物品一定会放进剩余容量最大的
直觉上你可能会认为这个贪心是错误的
那么我们这样来考虑
最终目的是使得 g[s] 最大
那么只需要说明存在一个状态 s^i 使得 g[s^i]-a[i] == g[s] 即可
因为 g[s] 是最大的 那么在这个状态中拿掉a[i] g[s]+a[i] 仍然是最大的
所以 g[s^i]>=g[s]+a[i] 这样应该就挺对了 嗯。
#include<cmath>
#include<ctime>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<string>
#include<bitset>
#include<queue>
#include<set>
#include<map>
using namespace std;typedef long long ll;inline int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
void print(int x)
{if(x<0)putchar('-'),x=-x;if(x>=10)print(x/10);putchar(x%10+'0');}const int N=(1<<24)+100;int f[N],g[N],a[N],c[110];int main()
{int n=read(),m=read();register int i,j,k,o;for(i=1;i<=n;++i) a[1<<(i-1)]=read();for(i=1;i<=m;++i) c[i]=read();sort(c+1,c+1+m);reverse(c+1,c+1+m);f[0]=1;g[0]=c[1];for(i=1;i<1<<n;++i){for(j=i;j;j-=(j&-j)){o=j&-j;if(!f[k=i^o]) continue;if(g[k]>=a[o]){if(!f[i] || f[i]>f[k] || (f[i]==f[k]&&g[i]<g[k]-a[o]))f[i]=f[k],g[i]=g[k]-a[o];}else if(c[f[k]+1]>=a[o])if(!f[i] || f[i]>f[k]+1 || (f[i]==f[k]+1&&g[i]<c[f[k]+1]-a[o]))f[i]=f[k]+1,g[i]=c[f[i]]-a[o];}}f[(1<<n)-1] ? (cout<<f[(1<<n)-1]<<endl,1) : (puts("NIE"),1);return 0;
}
BZOJ 3717: [PA2014]Pakowanie 状压dp相关推荐
- BZOJ 2073: [POI2004]PRZ( 状压dp )
早上这道题没调完就去玩NOI网络同步赛了.... 状压dp , dp( s ) 表示 s 状态下所用的最短时间 , 转移就直接暴力枚举子集 . 可以先预处理出每个状态下的重量和时间的信息 . 复杂度是 ...
- BZOJ 4000: [TJOI2015]棋盘( 状压dp + 矩阵快速幂 )
状压dp, 然后转移都是一样的, 矩阵乘法+快速幂就行啦. O(logN*2^(3m)) ------------------------------------------------------- ...
- BZOJ 2004 公交线路(状压DP+矩阵快速幂)
注意到每个路线相邻车站的距离不超过K,也就是说我们可以对连续K个车站的状态进行状压. 然后状压DP一下,用矩阵快速幂加速运算即可. #include <stdio.h> #include ...
- bzoj 2073:[POI2004]PRZ 状压DP
Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍在桥上的人都不能超过一定的限制. 所以这只队伍 ...
- BZOJ 2560: 串珠子 (状压DP+枚举子集补集+容斥)
(Noip提高组及以下),有意者请联系Lydsy2012@163.com,仅限教师及家长用户. 2560: 串珠子 Time Limit: 10 Sec Memory Limit: 128 MB Su ...
- BZOJ 4042 Luogu P4757 [CERC2014]Parades (树形DP、状压DP)
题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4042 (Luogu) https://www.luogu.org/prob ...
- 【BZOJ】1076 [SCOI2008]奖励关 期望DP+状压DP
[题意]n种宝物,k关游戏,每关游戏给出一种宝物,可捡可不捡.每种宝物有一个价值(有负数).每个宝物有前提宝物列表,必须在前面的关卡取得列表宝物才能捡起这个宝物,求期望收益.k<=100,n&l ...
- BZOJ 2734 [HNOI2012]集合选数 (状压DP、时间复杂度分析)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2734 题解 嗯早就想写的题,昨天因为某些不可告人的原因(大雾)把这题写了,今天再来写题解 ...
- BZOJ.3058.四叶草魔杖(Kruskal 状压DP)
题目链接 \(2^{16}=65536\),可以想到状压DP.但是又有\(\sum A_i\neq 0\)的问题.. 但是\(2^n\)这么小,完全可以枚举所有子集找到\(\sum A_i=0\)的, ...
- bzoj 1072: [SCOI2007]排列perm(状压dp)
1072: [SCOI2007]排列perm Time Limit: 10 Sec Memory Limit: 128 MB Submit: 2272 Solved: 1432 [Submit][ ...
最新文章
- Windows Embedded Compact 7网络编程概述(上)
- C# 字段 属性 方法 三霸主齐上阵
- python programming training(四):动态规划
- 直播系统:泛娱乐直播新趋势
- 蓝牙耳机测试用例_移动端测试用例设计总结,这些你得懂!
- 前端学习(1673):前端系列实战课程之最终封装
- 清空缓存的命令_超详细的mysql数据库查询缓存原理解析、涉及命令、流程分析等...
- 【C++】重载赋值运算符
- 查询作者名长度大于8的 sql语言_从零学会SQL-入门
- [Linux] Ubuntu Server 12.04 LTS 平台上搭建WordPress(Nginx+MySQL+PHP) Part IV
- 团队作业-第1周-提交处-团队组建及项目启动
- C语言实现简单贪吃蛇代码
- 饥荒联机版Mod开发——制作简单的物品(三)
- C# 图片反色处理 图片夜间模式
- Spring整合FreeMarker生成静态页面(静态模板)
- matlab 自写iradon,matlab的radon变换
- 什么是十六进制法_什么是十六进制-十六进制详解-嗨客网
- Glide 加载webp动图实战(解决图片每帧间隔过长,动图单次播放,二次播放动图时首帧是动图最后一帧的问题)
- Unity3D---通过Shader实现美颜
- 张孝祥正在整理Java就业面试题大全20100602版本(一)
热门文章
- Jspreadsheet v4:JavaScript 电子表格
- 使用JavaScript进行iframe的DOM操作
- 酷睿i3、i5、i7 一代 二代 区别对比
- movsw 汇编_汇编指令之ADC、SBB、XCHG、MOVS指令
- python如何读取dbf文件_python2.7读取dbf文件的正确姿势
- Joint 3D Proposal Generation and Object Detection from View Aggregation论文学习
- 小插件,通过js实现邮箱自动提示功能
- 留学生Essay写作没思路的解决方案
- 天猫订单详情页应该如何查看呢?
- 数据结构课程 -- 学期总结