POJ 2923 DP
题意:
两辆车去运一堆货物,货物数量小于等于10,问最少需要几趟能把货物全部运到目的地。
思路:
思路很简单,就是状态压缩成二进制。判断一下每个状态能不能运输。再进行一下DP。
设s[]数组里记录所有能转移的状态。
状态转移方程:f[i|s[j]]=min(f[i|s[j]],f[i]+1)
但是。 实现起来。。求出s[]数组用的方法很重要。。
先是二重循环枚举状态 但是这会超时。。。 竟然卡不过去。。。好失败
然后就想当然地用lowbit写。。。。肯定是WA了。
最后请教了cy才把这道题解了。。。她用了一个小优化。先统计出来1出现在哪里,然后再枚举,效率是会快一些。。
TLE代码:
// by SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int cases,n,C1,C2,w[11],s[1024],top,f[1024];
int main(){
scanf("%d",&cases);
for(int I=1;I<=cases;I++){
top=0,scanf("%d%d%d",&n,&C1,&C2);
for(int i=1;i<=n;i++)scanf("%d",&w[i]);
for(int i=1;i<=(1<<n)-1;i++)
for(int j=0;j<=i;j++)
if(i==(i|j)){
int tempx=i&j,tempy=i^j,jyx=0,jyy=0;
for(int k=1;tempx;k++,tempx/=2)if(tempx&1)jyx+=w[k];
for(int k=1;tempy;k++,tempy/=2)if(tempy&1)jyy+=w[k];
if((jyx<=C1&&jyy<=C2)){s[top++]=i;break;}
}
memset(f,0x3f,sizeof(f)),f[0]=0;
for(int i=0;i<=(1<<n)-1;i++)
for(int j=0;j<top;j++)
if(!(i&s[j]))f[i|s[j]]=min(f[i|s[j]],f[i]+1);
printf("Scenario #%d:\n%d\n\n",I,f[(1<<n)-1]);
}
}
AC代码:
// by SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int cases,n,C1,C2,w[11],s[1024],top,f[1024];
bool judge(int x){
int q[11],pos=0,sum=0;
for(int k=1;x;k++,x>>=1)if(x&1)q[++pos]=k,sum+=w[k];
for(int i=0;i<1<<pos;i++){
int s=0;
for(int j=1;j<pos;j++)
if(i&(1<<j))s+=w[q[j]];
if((s<=C1&&sum-s<=C2)||(s<=C2&&sum-s<=C1))return 1;
}
return 0;
}
int main(){
scanf("%d",&cases);
for(int I=1;I<=cases;I++){
top=0,scanf("%d%d%d",&n,&C1,&C2);
for(int i=1;i<=n;i++)scanf("%d",&w[i]);
for(int i=1;i<1<<n;i++)
if(judge(i))s[top++]=i;
memset(f,0x3f,sizeof(f)),f[0]=0;
for(int i=0;i<1<<n;i++)
for(int j=0;j<top;j++)
if(!(i&s[j]))f[i|s[j]]=min(f[i|s[j]],f[i]+1);
printf("Scenario #%d:\n%d\n\n",I,f[(1<<n)-1]);
}
}
POJ 2923 DP的更多相关文章
- 【POJ 2923】Relocation(状压DP+DP)
题意是给你n个物品,每次两辆车运,容量分别是c1,c2,求最少运送次数.好像不是很好想,我看了网上的题解才做出来.先用状压DP计算i状态下,第一辆可以运送的重量,用该状态的重量总和-第一辆可以运送的, ...
- poj 2923 状压dp+01背包
好牛b的思路 题意:一系列物品,用二辆车运送,求运送完所需的最小次数,两辆车必须一起走 解法为状态压缩DP+背包,本题的解题思路是先枚举选择若干个时的状态,总状态量为1<<n,判断这些状态 ...
- poj 2923(状态压缩dp)
题意:就是给了你一些货物的重量,然后给了两辆车一次的载重,让你求出最少的运输次数. 分析:首先要从一辆车入手,搜出所有的一次能够运的所有状态,然后把两辆车的状态进行合并,最后就是解决了,有两种方法: ...
- POJ 2923 Relocation 装车问题 【状态压缩DP】+【01背包】
题目链接:https://vjudge.net/contest/103424#problem/I 转载于:>>>大牛博客 题目大意: 有 n 个货物,并且知道了每个货物的重量,每次用 ...
- POJ 2923 Relocation(01背包变形, 状态压缩DP)
Q: 如何判断几件物品能否被 2 辆车一次拉走? A: DP 问题. 先 dp 求解第一辆车能够装下的最大的重量, 然后计算剩下的重量之和是否小于第二辆车的 capacity, 若小于, 这 OK. ...
- POJ 2923 Relocation(状压DP+01背包)题解
题意:给你汽车容积c1,c2,再给你n个包裹的体积,问你最少运几次能全运走 思路:用2进制表示每次运送时某物在不在此次运送之中,1在0不在.我们把运送次数抽象成物品价值,把状态抽象成体积,用一个dp[ ...
- POJ 2923 【01背包+状态压缩/状压DP】
题目链接 Emma and Eric are moving to their new house they bought after returning from their honeymoon. F ...
- POJ 2923 Relocation(状压DP)题解
题意:有2辆车运货,每次同时出发,n(<10),各自装货容量c1 c2,问最少运几次运完. 思路:n比较小,打表打出所有能运的组合方式,用背包求出是否能一次运走.然后状压DP运的顺序. 代码: ...
- [POJ 2923] Relocation (动态规划 状态压缩)
题目链接:http://poj.org/problem?id=2923 题目的大概意思是,有两辆车a和b,a车的最大承重为A,b车的最大承重为B.有n个家具需要从一个地方搬运到另一个地方,两辆车同时开 ...
随机推荐
- swiper套路
swiper插件 quick start 基本结构 <div class="swiper-container"> <div class="swiper- ...
- Java基础2一基础语法
1.标识符 定义:在Java中给类名.方法名.包名,参数名等命名时使用的字符序列即标识符 规则: 由字母.数字.下划线和$符组成 不能以数字开头 长度无限制 严格区分大小写 不能是java中的保留关键 ...
- 企业级Spring应用的搭建
本次博客将要对SpringMVC做简单的介绍以及环境的搭建: 概述 Spring 框架是一个开源的平台,属于设计层面框架,整个系统面向接口,是分层的JavaSE/EE开源框架,用于解决复杂的企业应用开 ...
- Types in Javascript(jQuery)
String: 空字符串等于Boolean的false; htmlString: 包括起始tag和结束tag的字符串,代表html代码: Number:双精度64位,跟string一样属于immuta ...
- What are lazy variables?
Written by Paul Hudson @twostraws It's very common in iOS to want to create complex objects only ...
- 优动漫PAINT核心功能介绍
优动漫PAINT是一款功能强大的动漫绘图软件,适用于个人和专业团队创作,分为个人版和EX版.搭载了绘制漫画和插画所需的所有功能——丰富的笔工具.超强的笔压感应和手颤修正功能,可分别满足画师对于插画.漫 ...
- Python基础:条件判断 &&循环
1:条件判断 2:循环 2.1:for 2.2 while 小结: continue :跳出本次循环 进行下次循环, break :结束循环体.
- node——express框架
express基于Node.js是一个web开发框架,web框架是为了我们开发更方便,更简洁,更高效. 英文网址 中文网址 安装: npm install express --save express ...
- HDU1114 - Piggy-Bank
Before ACM can do anything, a budget must be prepared and the necessary financial support obtained. ...
- Android内存管理-SoftReference的使用
本文介绍对象的强.软.弱和虚引用的概念.应用及其在UML中的表示. 1.对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有 ...