[poj2923]Relocation_状压dp_01背包
Relocation poj-2923
题目大意:给出n个物品,有两辆车,两辆车必须一起出动并且每辆车有单独的容量。问最少需要运输多少次才能运走所有货物。
注释:n<=10,容量,物品代价<=1000且物品代价<=max(两车容量)。
想法:这题的入手比较的容易,之后的方法会直接影响代码美观性和时间效率。首先,我们通过简单的状态压缩以及状态表示统计出两辆车分别的可以单次承载的状态,比如此时第一辆车有cnt1种,第二辆车有cnt2种,然后我们通过暴力枚举两辆车所有的状态统计出两辆车一起行动所能承载的所有状态,由于两辆车是一起行动,所以这样的处理是恰到好处的。之后的方法就很重要,我当时tm脑袋一热——爆搜!完了就够jb呛了。不做介绍,我们介绍dp做法:
状态:dp[i]表示运走i状态所需要的最少时间。
转移:dp[ j | f [ i ] ] = min(dp[ j | f [ i ] ] , dp[ j ] + 1)。其中,j是暴力枚举所有状态,f[i]是两辆车所能单次运输的状态。
最后,附上丑陋的代码... ...
#include <iostream>
#include <cstdio>
#include <cstring>
#define inf 0x3f3f3f3f
using namespace std;
// int be[15];
int val[15];
int dp[10010];
int f1[1100];
int f2[1100];
int f[1100];
int cnt,n,c1,c2;
int getSum(int x)//计算一个状态所对应的代价
{
int ans=0;
int tot=0;
while(x>0)
{
tot++;
if(x&1) ans+=val[tot];
x>>=1;
}
return ans;
}
void before_hand()//预处理出两辆车单次运输所能运输的所有状态
{
// be[0]=1;
// for(int i=1;i<=10;i++)
// {
// be[i]=be[i-1]*2;
// }
int cnt1=0,cnt2=0;
for(int i=0;i<(1<<n);i++)
{
int k=getSum(i);
if(k<=c1) f1[++cnt1]=i;//f1表示第一辆车单次运输的状态
if(k<=c2) f2[++cnt2]=i;//f2表示第二辆车单次运输的状态
}
for(int i=1;i<=cnt1;i++)
{
for(int j=1;j<=cnt2;j++)
{
if(f1[i]&f2[j]) continue;
f[++cnt]=f1[i]|f2[j];
}
}
}
// bool v[10010];
// int minn=0x7f7f7f7f;
// void dfs(int temp,int s)
// {
// if(temp>minn) return;
// if(v[s]&&temp==minn) return;
// puts("Fuck");
// if(s==be[n]-1)
// {
// minn=min(minn,temp);
// return;
// }
// for(int i=1;i<=cnt;i++)
// {
// if(s&f[i]) continue;
// v[s^f[i]]=1;
// dfs(temp+1,s^f[i]);
// v[s^f[i]]=0;
// }
// }
void original()//初始化
{
memset(dp,0x3f,sizeof dp);
memset(f1,0,sizeof f1);
memset(f2,0,sizeof f2);
memset(f,0,sizeof f);
cnt=0;
}
int main()
{
int cases;
scanf("%d",&cases);
int base=0;
while(cases--)
{
original();//初始化
base++;
cin >> n >> c1 >> c2;
for(int i=1;i<=n;i++)
{
scanf("%d",&val[i]);
}
before_hand();
dp[0]=0;
for(int i=1;i<=cnt;i++)
{
for(int j=(1<<n)-1;j>=0;j--)//等号很重要,毕竟这不是不同的01背包
{
if(dp[j]==inf) continue;
if(j&f[i]) continue;
dp[j|f[i]]=min(dp[j|f[i]],dp[j]+1);//转移
}
}
printf("Scenario #%d:\n%d\n\n",base,dp[(1<<n)-1]);//输出即可... ...
}
return 0;
}
// int main()
// {
// cin >> n;
// for(int i=1;i<=n;i++)
// {
// scanf("%d",&val[i]);
// }
// printf("%d\n",getSum(17));
// return 0;
// }
小结:在枚举状态压缩01背包时,不要将内层循环的0给排除。
内存必须要开够
poj不能将带有注释信息的代码直接上交,别问我是怎么知道的... ...
[poj2923]Relocation_状压dp_01背包的更多相关文章
- HDU 6125 Free from square (状压DP+背包)
题意:问你从 1 - n 至多选 m 个数使得他们的乘积不能整除完全平方数. 析:首先不能整除完全平方数,那么选的数肯定不能是完全平方数,然后选择的数也不能相同的质因子. 对于1-500有的质因子至多 ...
- UVA - 10817 Headmaster's Headache (状压类背包dp+三进制编码)
题目链接 题目大意:有S门课程,N名在职教师和M名求职者,每名在职教师或求职者都有自己能教的课程集合以及工资,要求花费尽量少的钱选择一些人,使得每门课程都有至少两人教.在职教师必须选. 可以把“每个课 ...
- POJ2923--Relocation(01背包+状压dp)
果然对状压DP,我根本就不懂=.= /************************************************** Problem: 2923 User: G_lory Mem ...
- 树形DP和状压DP和背包DP
树形DP和状压DP和背包DP 树形\(DP\)和状压\(DP\)虽然在\(NOIp\)中考的不多,但是仍然是一个比较常用的算法,因此学好这两个\(DP\)也是很重要的.而背包\(DP\)虽然以前考的次 ...
- POJ 2923 【01背包+状态压缩/状压DP】
题目链接 Emma and Eric are moving to their new house they bought after returning from their honeymoon. F ...
- POJ 3628 01背包 OR 状压
思路: 1.01背包 先找到所有奶牛身高和与B的差. 然后做一次01背包即可 01背包的容积和价格就是奶牛们身高. 最后差值一减输出结果就大功告成啦! 2. 搜索 这思路很明了吧... 搜索的确可以过 ...
- NOI 2015 寿司晚宴 (状压DP+分组背包)
题目大意:两个人从2~n中随意取几个数(不取也算作一种方案),被一个人取过的数不能被另一个人再取.两个人合法的取法是,其中一个人取的任何数必须与另一个人取的每一个数都互质,求所有合法的方案数 (数据范 ...
- HDU 6125 Free from square (状压DP+分组背包)
题目大意:让你在1~n中选择不多于k个数(n,k<=500),保证它们的乘积不能被平方数整除.求选择的方案数 因为质数的平方在500以内的只有8个,所以我们考虑状压 先找出在n以内所有平方数小于 ...
- NOIP模拟 乘积 - 状压dp + 分组背包
题目大意: 给出n和k,求从小于等于n的数中取出不超过k个,其乘积是无平方因子数的方案数.无平方因子数:不能被质数的平方整除. 题目分析: 10(枚举\(n\le8\)),40(简单状压\(n\le1 ...
随机推荐
- MySQL通过localhost无法连接数据库的解决
问题:一台服务器的PHP程序通过localhost地址无法连接数据库,但是如果设置为127.0.0.1则可以正常连接,连接其他数据库服务器也正常.MySQL的权限设置正确,且通过mysql命令行客户端 ...
- Python Numpy包安装
1,下载python 下载地址: https://www.python.org/downloads/windows/ 2,配置python环境变量 在电脑的系统属性的系统变量path中添加python ...
- Caused by: java.lang.ClassNotFoundException: org.aspectj.lang.annotation.Around
1.错误描述 INFO:2015-05-01 11:12:15[localhost-startStop-1] - Root WebApplicationContext: initialization ...
- HTML5结合CSS的三种方法+结合JS的三种方法
HTML5+CSS: HTML中应用CSS的三种方法 一.内联 内联样式通过style属性直接套进HTML中去. 示例代码 <pstylepstyle="color:red" ...
- java用Kruskal实现最小生成树
今天更新这篇文章超级激动,因为我会最小生成树的算法了(其实昨天就开始研究了,只是昨天参加牛客网的算法比赛,结果又被虐了,好难过~) 最小生成树的算法,其实学了数据结构就会有一定的基础,Kruskal算 ...
- 启动就加载(三)initializingbean实现afterPropertiesSet方法
TransactionTemplate,就直接以TransactionTemplate为入口开始学习. TransactionTemplate的源码如下: public class Transacti ...
- 从零一起学Spring Boot之LayIM项目长成记(三) 数据库的简单设计和JPA的简单使用。
前言 今天是第三篇了,上一篇简单模拟了数据,实现了LayIM页面的数据加载.那么今天呢就要用数据库的数据了.闲言少叙,书归正传,让我们开始吧. 数据库 之前有好多小伙伴问我数据库是怎么设计的.我个人用 ...
- AC自动机模板3【洛谷3796】
AC自动机的第三个模板 其实,个人觉得,目前我写的这三个不同的模板完全是可以合并在一起求解的. 只是,在这两个无关联的OJ上,同一个AC自动机都可以完成的问题被拆成了三道题而已. 因此,代码只需要略加 ...
- 【Luogu1373】小a和uim之大逃离(动态规划)
[Luogu1373]小a和uim之大逃离(动态规划) 题面 题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声.刹那间,狂风大作,乌云布 ...
- 【HDU1754】I hate it!
题面 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然, ...