POJ-2923 Relocation---01背包+状态压缩
题目链接:
https://vjudge.net/problem/POJ-2923
题目大意:
有n个货物,给出每个货物的重量,每次用容量为c1,c2的火车运输,问最少需要运送多少次可以将货物运完
思路:
第一次做状态压缩(状态压缩基础知识传送门)
本题的解题思路是先枚举选择若干个时的状态,总状态量为1<<n,判断这些状态集合里的那些物品能否一次就运走,如果能运走,那就把这个状态看成一个物品。预处理完能从枚举中找到tot个物品,再用这tol个物品中没有交集(也就是两个状态不能同时含有一个物品)的物品进行01背包,每个物品的体积是state[i](state[i]表示一次可以运完状态i的物品,i的二进制表示i这个状态的物品),价值是1,求包含n个物品的最少价值也就是dp[(1<<n)-1](dp[i]表示状态i需要运的最少次数)。
状态转移方程:dp[j|k] = min(dp[j|k],dp[k]+1) (k为state[i],1<=j<=(1<<n)-1])。
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<set>
#include<cmath>
using namespace std;
typedef pair<int, int> Pair;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int maxn = +;
int T, n, m1, m2;
int a[], cnt[maxn], dp[maxn], tot, cases;
bool vis[maxn];
bool judge(int x)
{
int sum = ;
memset(vis, , sizeof(vis));//vis[i]=1表示m1的车子中可以凑出体积为i的物品
vis[] = ;
for(int i = ; i < n; i++)
{
if(x & ( << i))//第i件物品存在
{
sum += a[i];
for(int j = m1; j >= a[i]; j--)
if(vis[j - a[i]])vis[j] = ;//此处必须是逆序,因为更新vis[j]的时候要用到vis[j-a[i]],和01背包是一样的
}
}
for(int i = ; i <= m1; i++)
{
if(vis[i] && sum - i <= m2)//确保全部物品可以一次性放在两个车子里面
return true;
}
return false;
}
void init()
{
memset(dp, INF, sizeof(dp));
dp[] = ;
for(int i = ; i < ( << n); i++)
{
if(judge(i))
{
cnt[tot++] = i;
}
}
}
int main()
{
cin >> T;
while(T--)
{
cin >> n >> m1 >> m2;
tot = ;
for(int i = ; i < n; i++)cin >> a[i];
init();/*
for(int i = 0; i < tot; i++)
cout<<cnt[i]<<endl;*/
for(int i = ; i < tot; i++)//枚举物品
{
for(int j = ( << n) - ; j >= ; j--)//逆序枚举状态也是因为dp[j]的更新需要先用到dp[j-***]
{
if(dp[j] == INF)continue;
if((j & cnt[i]) == )//两者无交集
dp[j | cnt[i]] = min(dp[j | cnt[i]], dp[j] + );
//dp[j | cnt[i]]表示j这个状态加上第i件物品的值,可以从dp[j]+1推过去
}
}
printf("Scenario #%d:\n", ++cases);
printf("%d\n\n", dp[(<<n) - ]); }
}
POJ-2923 Relocation---01背包+状态压缩的更多相关文章
- POJ 2923 【01背包+状态压缩/状压DP】
题目链接 Emma and Eric are moving to their new house they bought after returning from their honeymoon. F ...
- POJ 2923 Relocation(01背包变形, 状态压缩DP)
Q: 如何判断几件物品能否被 2 辆车一次拉走? A: DP 问题. 先 dp 求解第一辆车能够装下的最大的重量, 然后计算剩下的重量之和是否小于第二辆车的 capacity, 若小于, 这 OK. ...
- POJ 2923 Relocation(01背包+状态压缩)
题意:有人要搬家,有两辆车可以运送,有若干家具,车有容量限制,而家具也有体积,那么如何运送会使得运送车次最少?规定两车必须一起走,两车一次来回只算1躺. 思路:家具怎么挑的问题,每趟车有两种可能:1带 ...
- hdu6149 Valley Numer II 分组背包+状态压缩
/** 题目:hdu6149 Valley Numer II 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6149 题意: 众所周知,度度熊非常喜欢图. ...
- hdu6125 Free from square 分组背包+状态压缩
/** 题目:hdu6125 Free from square 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6125 题意: 从不大于n的所有正整数中选出 ...
- poj - 3254 - Corn Fields (状态压缩)
poj - 3254 - Corn Fields (状态压缩)超详细 参考了 @外出散步 的博客,在此基础上增加了说明 题意: 农夫有一块地,被划分为m行n列大小相等的格子,其中一些格子是可以放牧的( ...
- POJ 2923 Relocation (状态压缩,01背包)
题意:有n个(n<=10)物品,两辆车,装载量为c1和c2,每次两辆车可以运一些物品,一起走.但每辆车物品的总重量不能超过该车的容量.问最少要几次运完. 思路:由于n较小,可以用状态压缩来求解. ...
- POJ 2923 Relocation 装车问题 【状态压缩DP】+【01背包】
题目链接:https://vjudge.net/contest/103424#problem/I 转载于:>>>大牛博客 题目大意: 有 n 个货物,并且知道了每个货物的重量,每次用 ...
- [POJ 2923] Relocation (动态规划 状态压缩)
题目链接:http://poj.org/problem?id=2923 题目的大概意思是,有两辆车a和b,a车的最大承重为A,b车的最大承重为B.有n个家具需要从一个地方搬运到另一个地方,两辆车同时开 ...
随机推荐
- 数据库入门之运行原始 SQL 查找
数据库入门之运行原始 SQL 查找 一旦你设置好了数据库连接,就可以使用 DB facade 来进行查找.DB facade 提供每个类型的查找方法:select.update.insert.dele ...
- Mysql设置字段自动获取时间
问题:现在在用户表中有一个字段表示用户创建的时间 第一个想法是写一段程序获得系统当前时间,想想就太麻烦了,果断放弃,之后想到了存储过程和函数,再想想还要编写存储过程或者函数的代码,有点放弃的想法,但是 ...
- 常用Markdown公式整理 && 页内跳转注意 && Markdown preview
目录: 常用Markdown公式及注意事项 标题 列表 链接 区块 代码块 / 引用 粗体和斜体 文字块 图片 表格 横线 页内跳转注意事项 其他重要需注意 Markdown preview 前提: ...
- Tomcat下wtpwebapps文件夹 和 webapps文件夹区别
这两者其实没有区别.都是项目部署路径 webapps : tomcat默认部署路径 wtpwebapps : eclipse默认部署路径 只不过Tomcat6将wtpwebapps作为了默认路径,如果 ...
- 套接字API
Q:套接字特点 A:管道,消息队列,信号量,共享内存这些通信机制只能允许同一计算机上运行的进程相互通信,而套接字不仅可以提供在同一计算机上的进程间通信,还可以提供不同计算机上的进程间通信. 服务器端: ...
- 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址;
package com.utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.htt ...
- [poj1068]Parencodings_模拟
Parencodings 题目大意:给你一个P序列,表示从左到右的右括号左边有多少左括号,求M序列. 注释:M序列定义为每一个右括号左边最近的没有被之前的右括号匹配的括号之间,有多少已经匹配的括号队对 ...
- Oracle的常用的命令
--导出数据库 exp test2/test2@trp84 file=e:\test2.dmp owner=test2 --导入数据库 imp test2/test2@orcl file='e:\te ...
- Python中的SQLAlchemy
在Python中,使用SQLAlchemy可以对数据库进行操作. SQLAlchemy是Python中的一个标准库. 要使用SQLAlchemy,首先要创建连接: url = mysql+pymysq ...
- 测试工作中经常用到的几个Linux命令(第一弹)
自己平时测试工作中经常要在Linux下搭建测试环境,有涉及到启动/终止服务器,修改tomcat配置文件,偶尔碰到端口被占用... 这时就不得不需要一些基本的Linux命令来处理遇到的这些问题(顺便迈向 ...