BZOJ3717 [PA2014] Pakowanie [状态压缩][DP]
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]相关推荐
- 0x56. 动态规划 - 状态压缩DP(习题详解 × 7)
目录 Problem A. 最短Hamilton路径 ProblemB. 蒙德里安的梦想 Problem C. Corn Fields Problem D. 小国王 Problem E. 炮兵阵地 P ...
- POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)
poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...
- BZOJ1688|二进制枚举子集| 状态压缩DP
Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) ...
- hdu1074 状态压缩dp+记录方案
题意: 给你一些作业,每个作业有自己的结束时间和花费时间,如果超过结束时间完成,一天扣一分,问你把n个作业完成最少的扣分,要求输出方案. 思路: 状态压缩dp,记录方案数的地方 ...
- FZU-2218 Simple String Problem(状态压缩DP)
原题地址: 题意: 给你一个串和两个整数n和k,n表示串的长度,k表示串只有前k个小写字母,问你两个不含相同元素的连续子串的长度的最大乘积. 思路: 状态压缩DP最多16位,第i位的状态表示第i位字母 ...
- 《算法竞赛进阶指南》打卡-基本算法-AcWing 91. 最短Hamilton路径:位运算、状态压缩dp、dp
文章目录 题目解答 题目链接 题目解答 分析: 状态压缩dp是用二进制数来表示状态. 数据范围n = 20, 那么状态总量就是2202^{20}220个状态. 可以按照以下思路去思考: 哪些点被用过 ...
- 状态压缩DP AcWing算法提高课 (详解)
基础课的状态压缩点这里 基础课中 蒙德里安的梦想 属于 棋盘式状态压缩dp,最短Hamilton路径 属于 集合状态压缩dp 1064. 小国王(棋盘式/基于连通性) 这种棋盘放置类问题,在没有事先知 ...
- hdu 5067(状态压缩dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5067 解题思路:这道题开始想复杂了,想用bfs去求出最短距离,其实没必要,因为题目中没有阻碍关系,所以 ...
- hdu 5418(状态压缩dp+Floyd)
点击打开链接 解题思路:这道题目和TSP问题很相似,唯一不同的是同一个点可以重复走几次.... 这道题目只有16个顶点,所以很容易想到状态压缩dp,dp[i][j]表示到达顶点i时的状态为j的最小花费 ...
- 状态压缩dp入门 第一题 POJ 3254 Corn Fields
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6460 Accepted: 3436 Descr ...
最新文章
- 大数据产品不仅仅是IT工具
- 计算机书籍-大型网站性能优化实战
- 程序员为什么会有职业瓶颈?
- java序列化与反序列化(转)
- 【GitHub】如何合并分支?
- Ubuntu系统---C++之Eclipse 开始工程项目
- wildfly_从WildFly 9(子系统)中运行OkHttpClient
- java 操作窗口_java selenium (十二) 操作弹出窗口
- oracle追踪触发器语句,Oracle中怎样通过触发器来追踪用户的活动?
- 设置linux的console为串口【转】
- 华为三星和解;联想全球首发折叠电脑;苹果回应美高院裁决 | 极客头条
- 擷取 GridView 資料列的欄位值集合
- java 读取excel wps_安装WPS引发的excel上传问题
- 怎么通俗简洁地解释「云端」和「云计算」?
- python多线程抢票_抢票 抢票 抢票!Python大牛带你实现12306全自动抢票
- 【交易架构day9】阿里交易系统演进之路
- 域名讲解(一)域名基础概念
- exports is not defined
- 如何在windows下运用dd来下修复坏块?
- 获取qq音乐外链方法+源码
热门文章
- 常见路由器默认用户名和密码
- 逃跑h5小游戏源码熊出没手机游戏
- 如何处理条码打印机打出来是空白的故障
- 累计独立访客(UV)不低于 1000 是什么意思,怎么推广呢解决1000呢?
- 计算机windows错误恢复,教你“Windows错误恢复”的修复方法技巧
- Maven 打包-添加第三方包、依赖包 mvn clean package
- 苹果系统版本依次顺序_苹果手机顺序
- word文档分页符与分节符区别
- 图像处理Task05图像分割/二值化
- (c语言详解)06-图3 六度空间 (30分)(详细解释)