BZOJ3717 [PA2014] Pakowanie [状态压缩][DP]

Time Limit: 90 Sec Memory Limit: 256 MB

Description

你有n个物品和m个包。物品有重量,且不可被分割;包也有各自的容量。要把所有物品装入包中,至少需要几个包?

Input

第一行两个整数n,m(1<=n<=24,1<=m<=100),表示物品和包的数量。
第二行有n个整数a[1],a[2],…,a[n](1<=a[i]<=108)a[1],a[2],…,a[n](1<=a[i]<=108)a[1],a[2],…,a[n](1,分别表示物品的重量。
第三行有m个整数c[1],c[2],…,c[m](1<=c[i]<=108)c[1],c[2],…,c[m](1<=c[i]<=108)c[1],c[2],…,c[m](1,分别表示包的容量。

Output

如果能够装下,输出一个整数表示最少使用包的数目。若不能全部装下,则输出NIE。

Sample Input

4 3
4 2 10 3
11 18 9

Sample Output

2

解法

我最开始还在纠结为什么不用普通的背包做,因为普通的背包只有一个啊……= =

首先有一个贪心:尽可能使用容积大的背包,这样装得更多。

显然要压缩物品的数量。所以用状态f[s]f[s]f[s]表示选定sss集合中的物品最少使用的包的数目(因此f" role="presentation" style="position: relative;">fff数组要初始化为MAXMAXMAX)。但是会发现这样的状态不好推,因为不知道下一个物品应该放在哪里。所以再来一个数组g[s]g[s]g[s]表示选定集合sss中的物品剩余的最大容积。如果下一个物品j" role="presentation" style="position: relative;">jjj的容积小于这个最大容积,那么jjj就和s" role="presentation" style="position: relative;">sss共用f[s]f[s]f[s]个包;否则如果第f[s]+1f[s]+1f[s]+1个背包能装下第jjj个物品,那么j就放进这个背包里面,j" role="presentation" style="position: relative;">jjj与sss中的物品共同使用了f[s]+1" role="presentation" style="position: relative;">f[s]+1f[s]+1f[s]+1个包。

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 16777316
using namespace std;
int A[30],B[150],f[N],g[N];
bool cmp(int a,int b){return a>b;}
int main(){int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",&A[i]);for(int i=1;i<=m;i++)scanf("%d",&B[i]);sort(B+1,B+m+1,cmp);int nn=(1<<n)-1;for(int i=1;i<=nn;i++)f[i]=m+1;for(int i=1;i<=nn;i++){for(int j=0;j<n;j++){if(!(i&(1<<j)))continue;int k=i^(1<<j);if(g[k]>=A[j+1]){//要使得使用的背包数量最小,或者数量相同时剩余的容积尽可能大if(f[i]>f[k] || (f[i]==f[k] && g[i]<g[k]-A[j+1]))f[i]=f[k],g[i]=g[k]-A[j+1];}else if(B[f[k]+1]>=A[j+1]){if(f[i]>f[k]+1 || (f[i]==f[k]+1 && g[i]<B[f[k]+1]-A[j+1]))f[i]=f[k]+1,g[i]=B[f[k]+1]-A[j+1];}}}if(f[nn]<=m)printf("%d",f[nn]);else printf("NIE");return 0;
}

BZOJ3717 [PA2014] Pakowanie [状态压缩][DP]相关推荐

  1. 0x56. 动态规划 - 状态压缩DP(习题详解 × 7)

    目录 Problem A. 最短Hamilton路径 ProblemB. 蒙德里安的梦想 Problem C. Corn Fields Problem D. 小国王 Problem E. 炮兵阵地 P ...

  2. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

  3. BZOJ1688|二进制枚举子集| 状态压缩DP

    Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) ...

  4. hdu1074 状态压缩dp+记录方案

    题意:       给你一些作业,每个作业有自己的结束时间和花费时间,如果超过结束时间完成,一天扣一分,问你把n个作业完成最少的扣分,要求输出方案. 思路:       状态压缩dp,记录方案数的地方 ...

  5. FZU-2218 Simple String Problem(状态压缩DP)

    原题地址: 题意: 给你一个串和两个整数n和k,n表示串的长度,k表示串只有前k个小写字母,问你两个不含相同元素的连续子串的长度的最大乘积. 思路: 状态压缩DP最多16位,第i位的状态表示第i位字母 ...

  6. 《算法竞赛进阶指南》打卡-基本算法-AcWing 91. 最短Hamilton路径:位运算、状态压缩dp、dp

    文章目录 题目解答 题目链接 题目解答 分析: 状态压缩dp是用二进制数来表示状态. 数据范围n = 20, 那么状态总量就是2202^{20}220个状态. 可以按照以下思路去思考: 哪些点被用过 ...

  7. 状态压缩DP AcWing算法提高课 (详解)

    基础课的状态压缩点这里 基础课中 蒙德里安的梦想 属于 棋盘式状态压缩dp,最短Hamilton路径 属于 集合状态压缩dp 1064. 小国王(棋盘式/基于连通性) 这种棋盘放置类问题,在没有事先知 ...

  8. hdu 5067(状态压缩dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5067 解题思路:这道题开始想复杂了,想用bfs去求出最短距离,其实没必要,因为题目中没有阻碍关系,所以 ...

  9. hdu 5418(状态压缩dp+Floyd)

    点击打开链接 解题思路:这道题目和TSP问题很相似,唯一不同的是同一个点可以重复走几次.... 这道题目只有16个顶点,所以很容易想到状态压缩dp,dp[i][j]表示到达顶点i时的状态为j的最小花费 ...

  10. 状态压缩dp入门 第一题 POJ 3254 Corn Fields

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6460   Accepted: 3436 Descr ...

最新文章

  1. 大数据产品不仅仅是IT工具
  2. 计算机书籍-大型网站性能优化实战
  3. 程序员为什么会有职业瓶颈?
  4. java序列化与反序列化(转)
  5. 【GitHub】如何合并分支?
  6. Ubuntu系统---C++之Eclipse 开始工程项目
  7. wildfly_从WildFly 9(子系统)中运行OkHttpClient
  8. java 操作窗口_java selenium (十二) 操作弹出窗口
  9. oracle追踪触发器语句,Oracle中怎样通过触发器来追踪用户的活动?
  10. 设置linux的console为串口【转】
  11. 华为三星和解;联想全球首发折叠电脑;苹果回应美高院裁决 | 极客头条
  12. 擷取 GridView 資料列的欄位值集合
  13. java 读取excel wps_安装WPS引发的excel上传问题
  14. 怎么通俗简洁地解释「云端」和「云计算」?
  15. python多线程抢票_抢票 抢票 抢票!Python大牛带你实现12306全自动抢票
  16. 【交易架构day9】阿里交易系统演进之路
  17. 域名讲解(一)域名基础概念
  18. exports is not defined
  19. 如何在windows下运用dd来下修复坏块?
  20. 获取qq音乐外链方法+源码

热门文章

  1. 常见路由器默认用户名和密码
  2. 逃跑h5小游戏源码熊出没手机游戏
  3. 如何处理条码打印机打出来是空白的故障
  4. 累计独立访客(UV)不低于 1000 是什么意思,怎么推广呢解决1000呢?
  5. 计算机windows错误恢复,教你“Windows错误恢复”的修复方法技巧
  6. Maven 打包-添加第三方包、依赖包 mvn clean package
  7. 苹果系统版本依次顺序_苹果手机顺序
  8. word文档分页符与分节符区别
  9. 图像处理Task05图像分割/二值化
  10. (c语言详解)06-图3 六度空间 (30分)(详细解释)