题意:给你汽车容积c1,c2,再给你n个包裹的体积,问你最少运几次能全运走

思路:用2进制表示每次运送时某物在不在此次运送之中,1在0不在。我们把运送次数抽象成物品价值,把状态抽象成体积,用一个dp[ i ] 记录完成状态i的最少步数那么就转化为了01背包问题,得到状态转移方程dp[ j|state ] = min( dp[ j|state ],dp[j] + 1 ),state为运送时物品的状态。

然后讲一下可能会有点看不懂的judge()的一段代码

for(int j = c1;j >= val[i];j--){    //将所有可能放进c1的组合标记为1
if(vis[j - val[i]])
vis[j] = 1;
}

这里的意思是将所有能放进c1的组合标记为1,他是这样运作的:先将vis[0] = 1,这样每次j到val[i]时,val[i]肯定会被置为1,因为是从c1开始往下搜,如果搜到一个vis[j - val[i]] = 1,这说明 j-val[i] 和 val[i] 能做成一个体积为j(j<=c1)的组合,可见j能塞进c1,所以置为1,这样一直搜索就能搜到所有的组合

参考题解

代码:

#include<cstdio>
#include<map>
#include<set>
#include<queue>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define ll long long
const int maxn = 1 << 10;
const int MOD = 100000000;
const int INF = 0x3f3f3f3f;
using namespace std;
int val[12],state[maxn],vis[maxn]; //vis[i] = 1代表重量为i的组合能塞进车c1
int dp[maxn]; //达成i状态最小步骤
int tot,n,c1,c2;
int judge(int x){ //判断能否一次运走
int sum = 0;
memset(vis,0,sizeof(vis));
vis[0] = 1;
for(int i = 0;i < n;i++){
if(x&1<<i){
sum += val[i];
for(int j = c1;j >= val[i];j--){
//将所有可能放进c1的组合标记为1
if(vis[j - val[i]])
vis[j] = 1;
}
}
}
if(sum > c1+c2) return 0; //总体积大于两车总容积
for(int i = 0;i <= c1;i++){
if(vis[i] && sum - i <= c2){
//只要有一种分组能让两辆车都能塞进两种组合
return 1;
}
}
return 0;
}
void init(){ //初始化,找到所有能运送的状态
tot = 0;
for(int i = 1;i < (1<<n);i++){
dp[i] = INF;
if(judge(i)){
state[tot++] = i;
}
}
}
int main(){
int T,Case = 1;
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&c1,&c2);
for(int i = 0;i < n;i++)
scanf("%d",&val[i]);
init();
int V = (1<<n) - 1;
dp[0] = 0;
for(int i = 0;i < tot;i++){
for(int j = V;j >= 0;j--){
if(dp[j] == INF) continue;
if(j&state[i]) continue;
//有交集,不能送第二次
dp[j|state[i]] = min(dp[j|state[i]],dp[j] + 1);
}
}
printf("Scenario #%d:\n%d\n\n",Case++,dp[(1<<n) - 1]);
}
return 0;
}

POJ 2923 Relocation(状压DP+01背包)题解的更多相关文章

  1. HDU 2923 Relocation(状压dp+01背包)

    题目代号:HDU2923 题目链接:http://poj.org/problem?id=2923 Relocation Time Limit: 1000MS Memory Limit: 65536K ...

  2. poj 2923 状压dp+01背包

    好牛b的思路 题意:一系列物品,用二辆车运送,求运送完所需的最小次数,两辆车必须一起走 解法为状态压缩DP+背包,本题的解题思路是先枚举选择若干个时的状态,总状态量为1<<n,判断这些状态 ...

  3. BZOJ 4145: [AMPPZ2014]The Prices( 状压dp + 01背包 )

    我自己只能想出O( n*3^m )的做法....肯定会T O( nm*2^m )做法: dp( x, s ) 表示考虑了前 x 个商店, 已买的东西的集合为s. 考虑转移 : 先假设我们到第x个商店去 ...

  4. 树形DP和状压DP和背包DP

    树形DP和状压DP和背包DP 树形\(DP\)和状压\(DP\)虽然在\(NOIp\)中考的不多,但是仍然是一个比较常用的算法,因此学好这两个\(DP\)也是很重要的.而背包\(DP\)虽然以前考的次 ...

  5. NOI 2015 寿司晚宴 (状压DP+分组背包)

    题目大意:两个人从2~n中随意取几个数(不取也算作一种方案),被一个人取过的数不能被另一个人再取.两个人合法的取法是,其中一个人取的任何数必须与另一个人取的每一个数都互质,求所有合法的方案数 (数据范 ...

  6. NOIP模拟 乘积 - 状压dp + 分组背包

    题目大意: 给出n和k,求从小于等于n的数中取出不超过k个,其乘积是无平方因子数的方案数.无平方因子数:不能被质数的平方整除. 题目分析: 10(枚举\(n\le8\)),40(简单状压\(n\le1 ...

  7. HDU - 6125: Free from square (状压DP+分组背包)

    problem:给定N,K.表示你有数1到N,让你最多选择K个数,问有多少种方案,使得选择的数的乘积无平方因子数.N,K<500: solution:显然可以状压DP做,但是500以内的素数还是 ...

  8. POJ 3254 简单状压DP

    没什么可说的,入门级状压DP.直接撸掉 #include <iostream> #include <cstring> #include <cstdlib> #inc ...

  9. HDU 4272 LianLianKan (状压DP+DFS)题解

    思路: 用状压DP+DFS遍历查找是否可行.假设一个数为x,那么他最远可以消去的点为x+9,因为x+1~x+4都能被他前面的点消去,所以我们将2进制的范围设为2^10,用0表示已经消去,1表示没有消去 ...

随机推荐

  1. setTimeout原来有这种用途

    setTimeout有两个参数,第一个是需要执行的函数,第二个是将该函数推入UI队列的时间. 需要注意的两点: 1.第二个参数中设置的时间,是从执行setTimeout开始计算,而不是从整个函数执行完 ...

  2. html-withimg-loder

    由于 webpack 对 html 的处理不太好,打包 HTML 文件中的图片资源是相对来说最麻烦的.这里需要引用一个插件—— html-withimg-loder // 打包 HTML 文件中的图片 ...

  3. Java初学者笔记三:关于字符串和自实现数组常见操作以及异常处理

    一.字符串常见的操作 1.结合我在python中对于字符串常见处理总结出下面三个应该能算是字符串造作的TOP 3 //字符串查找子串,存在返回index,不存在返回-1 等于python的find: ...

  4. 【BZOJ2164】采矿 树链剖分+线段树维护DP

    [BZOJ2164]采矿 Description 浩浩荡荡的cg大军发现了一座矿产资源极其丰富的城市,他们打算在这座城市实施新的采矿战略.这个城市可以看成一棵有n个节点的有根树,我们把每个节点用1到n ...

  5. Java项目工程化之项目构建工具Maven

    欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝 ...

  6. SaltStack生产案例-系统初始化

    需求分析 一,系统初始化 1.1  关闭SELinux 1.2  关闭默认iptables 1.3  时间同步(配置NTP)  1.4  文件描述符(必备/etc/security/limmits.c ...

  7. php中函数preg_match或preg_match_all 第三个参数$match的解释

    理解自:http://www.cnblogs.com/vicenteforever/articles/1623137.html php手册中是这样解释的 matches 如果提供了参数matches, ...

  8. AutoLayout性能不如frame

    http://draveness.me/layout-performance.html 复杂视图, 数量超过30个,用autoLayout就比较卡顿了 发现首页类似朋友圈,卡顿的原因应该就是使用了au ...

  9. Spark 参数配置的几种方法

    1.Spark 属性Spark应用程序的运行是通过外部参数来控制的,参数的设置正确与否,好与坏会直接影响应用程序的性能,也就影响我们整个集群的性能.参数控制有以下方式:(1)直接设置在SparkCon ...

  10. Django REST Framework简单入门(一)

    Django REST Framework(简称DRF),是一个用于构建Web API的强大且灵活的工具包. REST这个词,是Roy Thomas Fielding在他2000年的博士论文中提出的. ...