[POJ 2923] Relocation (动态规划 状态压缩)
题目链接:http://poj.org/problem?id=2923
题目的大概意思是,有两辆车a和b,a车的最大承重为A,b车的最大承重为B。有n个家具需要从一个地方搬运到另一个地方,两辆车同时开,问最少需要搬运几次?
我先想的是我由A车开始搬,搬运能装的最大的家具总重,然后状态压缩记录下搬运了哪些,然后再由B车搬运,状态压缩记录搬运了哪些。以此类推,直到状态满了。
以上方法TLE
然后,实在想不出来了,看了题解:http://blog.csdn.net/woshi250hua/article/details/7636061
也就是说先确定哪些状态是两辆车一次可以搬完的。
怎么确定呢?首先我们先确定出给定状态集合中所有可能出现的并且可以被a车运送的重量,然后看是否存在总重量减去可被a车运送的重量所得到的剩余重量是否能够被b车运送。
如果可以,则这个状态是可以被a,b两辆车一次就送完的。
那么怎么确定给定状态集合中所有可能出现的并且可以被a车运送的重量呢?
这又是一个dp。
设计状态dp[i][j]表示状态集合中的前i个物品是否能够组成j这个重量
如果dp[i-1][j-w[i]]已经出现了(就是说如果存在了重量j-w[i],我只需要填上重量w[i]就可以形成j),那么dp[i-1][j]就可以组成。
这个问题结束。
对于总问题:
设计状态dp[i][j]表示从前i种已知可以一次搬完的里面搬状态j需要的最少次数。
状态转移:dp[i][j|mask[i]] = min(dp[i-1][j]+1,dp[i-1][j|mask[i]])
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <map>
#include <iterator>
#include <vector>
using namespace std;
typedef long long LL; int T;
int n,c[];
int w[];
int mask[];
int dp[]; bool C(int x){
bool can[];
memset(can,,sizeof(can));
can[] = true;
int sum = ;
for( int i=;i<=n;i++ )if((x>>(i-))&){
sum += w[i];
for( int j=c[];j>=w[i];j--){
if( can[j-w[i]] ) can[j] = true;
}
}
for(int i=;i<=c[];i++){
if( can[i]&&sum-i<=c[] ) return true;
}
return false;
} int main(){
scanf("%d",&T);
for(int t=;t<=T;t++){
scanf("%d%d%d",&n,&c[],&c[]);
for(int i=;i<=n;i++) scanf("%d",&w[i]);
int ptr = ;
for(int i=;i<(<<n);i++){
if( C(i) ) mask[++ptr] = i;
}
const int INF = ;
fill(dp,dp+,INF);
dp[] = ;
for(int i=;i<=ptr;i++){
for(int j=(<<n)-;j>=;j--) if((mask[i]&j)==) {
dp[mask[i]|j] = min(dp[mask[i]|j],dp[j]+);
}
}
printf("Scenario #%d:\n%d\n\n",t,dp[(<<n)-]);
}
return ;
}
代码
[POJ 2923] Relocation (动态规划 状态压缩)的更多相关文章
- POJ 2923 Relocation (状态压缩,01背包)
题意:有n个(n<=10)物品,两辆车,装载量为c1和c2,每次两辆车可以运一些物品,一起走.但每辆车物品的总重量不能超过该车的容量.问最少要几次运完. 思路:由于n较小,可以用状态压缩来求解. ...
- POJ 2923 Relocation(01背包变形, 状态压缩DP)
Q: 如何判断几件物品能否被 2 辆车一次拉走? A: DP 问题. 先 dp 求解第一辆车能够装下的最大的重量, 然后计算剩下的重量之和是否小于第二辆车的 capacity, 若小于, 这 OK. ...
- POJ 1185 炮兵阵地(动态规划+状态压缩)
炮兵阵地 Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原( ...
- poj 2923 Relocation 解题报告
题目链接:http://poj.org/problem?id=2923 题目意思:给出两部卡车能装的最大容量,还有n件物品的分别的weight.问以最优方式装入,最少能运送的次数是多少. 二进制表示物 ...
- POJ 3254. Corn Fields 状态压缩DP (入门级)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9806 Accepted: 5185 Descr ...
- POJ 3691 (AC自动机+状态压缩DP)
题目链接: http://poj.org/problem?id=3691 题目大意:给定N个致病DNA片段以及一个最终DNA片段.问最终DNA片段最少修改多少个字符,使得不包含任一致病DNA. 解题 ...
- POJ 1321 棋盘问题(状态压缩DP)
不总结的话, 同一个地方会 WA 到死 思路: 状态压缩 DP. 1. s 表示压缩状态, 若第 i 列放了棋子, 那么该列置 1, 否则该列置 0. 假如 s = 3(0x011) 那么表示棋盘的第 ...
- POJ 2046 Gap 搜索- 状态压缩
题目地址: http://poj.org/problem?id=2046 一道搜索状态压缩的题目,关键是怎样hash. AC代码: #include <iostream> #include ...
- POJ 3254 Corn Fields 状态压缩DP (C++/Java)
id=3254">http://poj.org/problem? id=3254 题目大意: 一个农民有n行m列的地方,每一个格子用1代表能够种草地,而0不能够.放牛仅仅能在有草地的. ...
随机推荐
- Linux入侵检测工具 - RKHunter
RKHunter是Linux系统平台下的一款开源入侵检测工具 特点 (1)安装便捷,运行快速 (2)扫描范围全,能够检测各种已知的rootkit特征码.端口扫描.常用程序文件的变动情况检查 主要功能 ...
- comet4j文档
Comet4J配置参数表 <!--Comet4J配置 --> <listener> <description>Comet4J容器侦听</description ...
- 前端js上传文件 到后端接收文件
下面是前端js代码: <html> <head> <meta http-equiv="Content-Type" content="text ...
- Hive(六):HQL DDL
HQL语法基于 SqlLine(http://sqlline.sourceforge.net/),DDL主要包含数据库.函数.视图的创建.修改.删除,参考资料:(https://cwiki.apach ...
- [Hibernate] - Query Select
测试了常用的一些HQL查询方法,具体HQL的强大可以参考: http://docs.jboss.org/hibernate/orm/3.5/reference/zh-CN/html/queryhql. ...
- 多线程要点--CLR C#学习笔记
1.windows永远不会调度一个进程,只调度线程. 2.线程和操作系统的关系:CLR(X)--AppDomain--线程池(包含工作者线程和I/O线程) 3.线程的关键组成部分 A.线程执行上下文 ...
- LeetCode "Longest Substring with At Most K Distinct Characters"
A simple variation to "Longest Substring with At Most Two Distinct Characters". A typical ...
- python安装psycopg2
vim ~/.bash_profile export PATH=/Applications/Postgres.app/Contents/Versions/9.4/bin/:$PATH pip inst ...
- css3旋转小三角
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- C#应用程序单进程检测
以下程序经过VS2010测试通过: /// <summary> /// 应用程序的主入口点. /// </summary> [STAThread] static void Ma ...