Poj 2923 Relocation(状态压缩+动态规划)

原创 2015年11月18日 22:18:07

这道题目想了好久,还是做不出来,最后在网上搜了大大们的题解,发现思路完全不一样,竟然用到了状态压缩,

然而状态压缩是什么鬼呢?不太明白呢....

题目大意:有家人要搬家,而一共有两辆车,最大载重量分别是C1,C2(1<=C1,C2<=100),他们一共有n(1<=n<=10)

件家具要搬,问至少需要走多少趟.

解释:家具的状态一共有2^n种(包括不可行的),首先在这么多的方案中分别找出 车1 和 车2 可以载得料的方案,

然后进一步处理,将 车1 和 车2 没有交集的方案(即每样家与只会被搬运一次)收集起来,得出一系列的可行方案.

然后进行一次dp,这里的转移方程是:dp[t]=min(dp[t], dp[i] + 1),有必要说明一下,初始状态dp[0]=0是成立的,转移方程中

的i 用二进制表示,那么dp[i]代表帮了某些家具所走的最少趟.同理,而dp[t]表示在i的情况下执行可行方案后的最优解.


可能表述有些问题,细节反面看代码的实现把.

#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <ctime>
#include <cmath>

using namespace std;
const int N = 100000;
int dp[N];
int c1[N],c2[N];
int ct1,ct2;
int bag[N],bat;
int main()
{
	//freopen("/home/user/桌面/in","r",stdin);
	int t,ca=1;
	scanf("%d",&t);
	while(ca<=t){
		int n,v1,v2,fur[15];
		scanf("%d%d%d",&n,&v1,&v2);
		ct1=ct2=bat=0;
		for(int i=0;i<n;++i) scanf("%d",&fur[i]);

		for(int i=0;i<(1<<n);++i){
			int w=0;
			for(int j=0;j<10;++j){
				if(i&(1<<j)) w+=fur[j];
			}
			if(w<=v1) c1[ct1++]=i;
			if(w<=v2) c2[ct2++]=i;
		}
		for(int i=0;i<ct1;++i){
			for(int j=0;j<ct2;++j){
				if((c1[i]&c2[j])==0) bag[bat++] =(c1[i] | c2[j]);
		//		if(i==0) cout<<" + "<<(c1[i]&c2[j])<<" -- "<<(c1[i]|c2[j])<<"  - "<<bat<<endl;
			}
		}
	//	sort(bag,bag+bat);
	//	for(int i=0;i<bat;++i) cout<<bag[i]<<endl;

		memset(dp,-1,sizeof(dp));
		dp[0]=0;
		for(int i=0;i<(1<<n);++i){
		//	if(dp[i]==-1) continue;
			for(int j=0;j<bat;++j){
				if(i&bag[j]) continue;
				int t = i|bag[j];
				if(dp[t]==-1) dp[t]=dp[i]+1;
				else dp[t]=min(dp[t],dp[i]+1);
			}
		}
		printf("Scenario #%d:\n",ca++);
		printf("%d\n\n",dp[(1<<n)-1]);
	}
	//printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
	return 0;
}


POJ 2923Relocation(状态压缩入门)

Description Emma and Eric are moving to their new house they bought after returning from their hone...
  • tomorrowtodie
  • tomorrowtodie
  • 2016年07月10日 00:53
  • 575

poj 2923 Relocation 状态压缩

题意:给你n件货物的重量(n 思路:货物数量很少,二进制记录状态,用背包预处理能一次运完的状态,再从初始全1状态开始bfs,到达全0状态结束。   #include #include #incl...
  • taozifish
  • taozifish
  • 2012年10月02日 15:16
  • 455

POJ 2923 Relocation(状态压缩+01背包)

Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2363   Accepted: 978 Description...
  • u012762625
  • u012762625
  • 2015年02月06日 12:43
  • 284

poj 2923 Relocation 状态压缩01背包

#include #include #define INF 1
  • yan_____
  • yan_____
  • 2013年02月28日 13:44
  • 327

poj 2923 Relocation 状态压缩+01背包

Relocation Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1626   Accepted: 657 ...
  • budlele
  • budlele
  • 2013年09月05日 20:24
  • 344

POJ 2923 Relocation (状态压缩+背包)

Description Emma and Eric are moving to their new house they bought after returning from their hon...
  • sulisulisu
  • sulisulisu
  • 2016年07月20日 16:32
  • 113

poj 2923 Relocation(状态压缩+01背包)

Relocation Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1846   Acc...
  • WEYuLi
  • WEYuLi
  • 2014年07月12日 18:37
  • 629

POJ 2923 Relocation(状态压缩+01背包)

Relocation Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3023   Acc...
  • sdfgdbvc
  • sdfgdbvc
  • 2016年05月20日 18:04
  • 137

poj 2923 Relocation (01背包+状态压缩)

Description Emma and Eric are moving to their new house they bought after returning from their ho...
  • hndu__lz
  • hndu__lz
  • 2017年02月21日 21:30
  • 74

POJ - 2923 Relocation(BFS+状态压缩)

题目大意:有一个人要搬家,他要把N件家具搬到新家,给出每件家具的重量 现在他有两辆货车,载重分别为c1和c2,每次都是两辆货车一起出发,问至少要多少趟才能搬完解题思路:先预处理出每辆货车的能搬的货,...
  • L123012013048
  • L123012013048
  • 2015年09月22日 23:32
  • 262
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Poj 2923 Relocation(状态压缩+动态规划)
举报原因:
原因补充:

(最多只允许输入30个字)