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 3
4 2 10 3
11 18 9

Sample Output

2

这似乎是一道显然的状压(

用 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相关推荐

  1. BZOJ 2073: [POI2004]PRZ( 状压dp )

    早上这道题没调完就去玩NOI网络同步赛了.... 状压dp , dp( s ) 表示 s 状态下所用的最短时间 , 转移就直接暴力枚举子集 . 可以先预处理出每个状态下的重量和时间的信息 . 复杂度是 ...

  2. BZOJ 4000: [TJOI2015]棋盘( 状压dp + 矩阵快速幂 )

    状压dp, 然后转移都是一样的, 矩阵乘法+快速幂就行啦. O(logN*2^(3m)) ------------------------------------------------------- ...

  3. BZOJ 2004 公交线路(状压DP+矩阵快速幂)

    注意到每个路线相邻车站的距离不超过K,也就是说我们可以对连续K个车站的状态进行状压. 然后状压DP一下,用矩阵快速幂加速运算即可. #include <stdio.h> #include ...

  4. bzoj 2073:[POI2004]PRZ 状压DP

    Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍在桥上的人都不能超过一定的限制. 所以这只队伍 ...

  5. BZOJ 2560: 串珠子 (状压DP+枚举子集补集+容斥)

    (Noip提高组及以下),有意者请联系Lydsy2012@163.com,仅限教师及家长用户. 2560: 串珠子 Time Limit: 10 Sec Memory Limit: 128 MB Su ...

  6. BZOJ 4042 Luogu P4757 [CERC2014]Parades (树形DP、状压DP)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4042 (Luogu) https://www.luogu.org/prob ...

  7. 【BZOJ】1076 [SCOI2008]奖励关 期望DP+状压DP

    [题意]n种宝物,k关游戏,每关游戏给出一种宝物,可捡可不捡.每种宝物有一个价值(有负数).每个宝物有前提宝物列表,必须在前面的关卡取得列表宝物才能捡起这个宝物,求期望收益.k<=100,n&l ...

  8. BZOJ 2734 [HNOI2012]集合选数 (状压DP、时间复杂度分析)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2734 题解 嗯早就想写的题,昨天因为某些不可告人的原因(大雾)把这题写了,今天再来写题解 ...

  9. BZOJ.3058.四叶草魔杖(Kruskal 状压DP)

    题目链接 \(2^{16}=65536\),可以想到状压DP.但是又有\(\sum A_i\neq 0\)的问题.. 但是\(2^n\)这么小,完全可以枚举所有子集找到\(\sum A_i=0\)的, ...

  10. bzoj 1072: [SCOI2007]排列perm(状压dp)

    1072: [SCOI2007]排列perm Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 2272  Solved: 1432 [Submit][ ...

最新文章

  1. Windows Embedded Compact 7网络编程概述(上)
  2. C# 字段 属性 方法 三霸主齐上阵
  3. python programming training(四):动态规划
  4. 直播系统:泛娱乐直播新趋势
  5. 蓝牙耳机测试用例_移动端测试用例设计总结,这些你得懂!
  6. 前端学习(1673):前端系列实战课程之最终封装
  7. 清空缓存的命令_超详细的mysql数据库查询缓存原理解析、涉及命令、流程分析等...
  8. 【C++】重载赋值运算符
  9. 查询作者名长度大于8的 sql语言_从零学会SQL-入门
  10. [Linux] Ubuntu Server 12.04 LTS 平台上搭建WordPress(Nginx+MySQL+PHP) Part IV
  11. 团队作业-第1周-提交处-团队组建及项目启动
  12. C语言实现简单贪吃蛇代码
  13. 饥荒联机版Mod开发——制作简单的物品(三)
  14. C# 图片反色处理 图片夜间模式
  15. Spring整合FreeMarker生成静态页面(静态模板)
  16. matlab 自写iradon,matlab的radon变换
  17. 什么是十六进制法_什么是十六进制-十六进制详解-嗨客网
  18. Glide 加载webp动图实战(解决图片每帧间隔过长,动图单次播放,二次播放动图时首帧是动图最后一帧的问题)
  19. Unity3D---通过Shader实现美颜
  20. 张孝祥正在整理Java就业面试题大全20100602版本(一)

热门文章

  1. Jspreadsheet v4:JavaScript 电子表格
  2. 使用JavaScript进行iframe的DOM操作
  3. 酷睿i3、i5、i7 一代 二代 区别对比
  4. movsw 汇编_汇编指令之ADC、SBB、XCHG、MOVS指令
  5. python如何读取dbf文件_python2.7读取dbf文件的正确姿势
  6. Joint 3D Proposal Generation and Object Detection from View Aggregation论文学习
  7. 小插件,通过js实现邮箱自动提示功能
  8. 留学生Essay写作没思路的解决方案
  9. 天猫订单详情页应该如何查看呢?
  10. 数据结构课程 -- 学期总结