HDU - 6006 Engineer Assignment (状压dfs)
题意:n个工作,m个人完成,每个工作有ci个阶段,一个人只能选择一种工作完成,可以不选,且只能完成该工作中与自身标号相同的工作阶段,问最多能完成几种工作。
分析:
1、如果一个工作中的某个工作阶段没有任何一个人能完成,则这个工作是不可完成的。
2、预处理每个人能完成各工作的各工作阶段。
3、剪枝:如果当前完成工作数+剩余人数<=ans则剪枝。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#define lowbit(x) (x & (-x))
const double eps = 1e-8;
inline int dcmp(double a, double b){
if(fabs(a - b) < eps) return 0;
return a > b ? 1 : -1;
}
typedef long long LL;
typedef unsigned long long ULL;
const int INT_INF = 0x3f3f3f3f;
const int INT_M_INF = 0x7f7f7f7f;
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;
const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};
const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};
const int MOD = 1e9 + 7;
const double pi = acos(-1.0);
const int MAXN = 10 + 10;
const int MAXT = 10000 + 10;
using namespace std;
vector<int> t[MAXN], project[MAXN];
vector<int> engineer[MAXN];
int status[MAXN];
int work[MAXN][MAXN];
int ans;
int n, m;
map<int, int> mp;
int projectnum;
void dfs(int cur, int done){
if(done + m - (cur - 1) <= ans) return;
if(cur == m + 1){
ans = max(ans, done);
return;
}
dfs(cur + 1, done);
for(int i = 1; i <= projectnum; ++i){
int len = project[i].size();
if(status[i] == (1 << len) - 1) continue;
int tmp = status[i];
status[i] |= work[cur][i];
if(status[i] == (1 << len) - 1){
dfs(cur + 1, done + 1);
}
else{
dfs(cur + 1, done);
}
status[i] = tmp;
}
}
void have(int x, int y){
int len1 = engineer[x].size();
int len2 = project[y].size();
for(int i = 0; i < len2; ++i){
bool ok = false;
for(int j = 0; j < len1; ++j){
if(engineer[x][j] == project[y][i]){
ok = true;
break;
}
}
if(ok) work[x][y] |= (1 << i);
}
}
int main(){
int T;
scanf("%d", &T);
int kase = 0;
while(T--){
mp.clear();
ans = 0;
for(int i = 0; i < MAXN; ++i){
project[i].clear();
engineer[i].clear();
t[i].clear();
}
memset(work, 0, sizeof work);
memset(status, 0, sizeof status);
scanf("%d%d", &n, &m);
int k, x;
for(int i = 1; i <= n; ++i){
scanf("%d", &k);
for(int j = 0; j < k; ++j){
scanf("%d", &x);
t[i].push_back(x);
}
}
for(int i = 1; i <= m; ++i){
scanf("%d", &k);
for(int j = 0; j < k; ++j){
scanf("%d", &x);
mp[x] = 1;
engineer[i].push_back(x);
}
}
projectnum = 0;
for(int i = 1; i <= n; ++i){
int l = t[i].size();
bool ok = true;
for(int j = 0; j < l; ++j){
if(!mp.count(t[i][j])){
ok = false;
break;
}
}
if(ok) project[++projectnum] = t[i];
}
for(int i = 1; i <= m; ++i){
for(int j = 1; j <= projectnum; ++j){
have(i, j);
}
}
dfs(1, 0);
printf("Case #%d: %d\n", ++kase, ans);
}
return 0;
}
HDU - 6006 Engineer Assignment (状压dfs)的更多相关文章
- hdu 6006 Engineer Assignment 状压dp
Engineer Assignment Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- HDU 6006 Engineer Assignment:状压dp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6006 题意: 在Google中,有个n项目,m个专家.第i个项目涉及c[i]个领域,分别为a[i][0 ...
- HDU6006:Engineer Assignment(状压DP)
传送门 题意 给出n个工程,m个工程师,每个工程和工程师需要/拥有若干个技能,询问能够完成的最大工程个数,每个工程师用一次 分析 dp[i][j]表示前i个工程用的工程师集合为j的最大工程个数,那么有 ...
- hdu 3247 AC自动+状压dp+bfs处理
Resource Archiver Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 100000/100000 K (Java/Ot ...
- hdu 2825 aC自动机+状压dp
Wireless Password Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- ZOJ 1609 Equivalence(状压+dfs减枝)
ZOJ Problem Set - 1609 Equivalence Time Limit: 5 Seconds Memory Limit: 32768 KB When learning m ...
- bzoj1725: [Usaco2006 Nov]Corn Fields牧场的安排(状压dfs)
1725: [Usaco2006 Nov]Corn Fields牧场的安排 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1122 Solved: 80 ...
- 状压dfs小记
一点前(tu)言(cao) 真的考起dfs来可谓是什么都能往dfs上套 状压不止能dp,还能与dfs结合成为搜索好(duliu)题 剪枝卡常司空见惯(打开题解一看并不是纯dfs,emmmm) 开始正文 ...
- HDU 4272 LianLianKan (状压DP+DFS)题解
思路: 用状压DP+DFS遍历查找是否可行.假设一个数为x,那么他最远可以消去的点为x+9,因为x+1~x+4都能被他前面的点消去,所以我们将2进制的范围设为2^10,用0表示已经消去,1表示没有消去 ...
随机推荐
- Atcoder Grand Contest 037A(贪心,思维)
#include<bits/stdc++.h>using namespace std;string s;char ans[200007][7];char anss[200007][7];i ...
- 安卓手机的屏幕规格很多。app开发者在设计User Interface的时候,要怎么处理,才能适应不同屏幕大小?
在app store下载应用时经常看到:此App已针对iPhone 5 进行优化.可是Android手机屏幕规格这么多,相差这么远.难道要针对每个尺寸都进行一次优化吗?(题主非专业人士,看到2014年 ...
- 深浅copy浅析
Python代码在开始执行的时候,代码会被系统从硬盘调入内存,等候CPU执行,至于怎么个调入逻辑,还不清楚. 在高级语言中,变量是对内存及其地址的抽象.也就是说变量就是内存地址. 那么我们先来介绍两种 ...
- myBatis mapper接口方法重载问题
在mybatis框架中,写dao层的mapper接口时,是不可以进行方法的重载的,下面是截图证明: 当mapper接口中有方法的重载时,会出现异常, 这是mapper接口中定义的两个方法,进行 ...
- P1120/UVA307 小木棍(sticks) 题解
题目描述 pdf 题解 注意的问题是,各个原始木棒的长度都是一样的! 说一下本题的总思路即:DFS+超强力剪枝!(详见本人的 AC 程序) 首先,我们要从小到大枚举原始木棒的长度len,也就是枚举答案 ...
- 「CH6101」最优贸易
「CH6101」最优贸易 传送门 考虑一种贪心的思想:我们要尽量买价格小的货物,并尽量高价转卖. 我们记 : \(mn[i]\) 为从点 \(1\) 走到点 \(i\) 经过的价格最小的货物的价格. ...
- 【快学springboot】12.实现拦截器
前言 之前在[快学springboot]6.WebMvcConfigurer配置静态资源和解决跨域里有用到WebMvcConfigurer接口来实现静态资源的映射和解决跨域请求,并且在文末还说了Web ...
- 第3节 storm高级应用:1、上次课程回顾,今日课程大纲,storm下载地址、运行过程等
上次课程内容回顾: ConcurrentHashMap是线程安全的,为什么多线程的时候还不好使,为什么还要加static关键字 1.storm的基本介绍:strom是twitter公司开源提供给apa ...
- Java垃圾回收机制详解和调优
gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存.java语言并不要求jvm有gc,也没有规定gc如何工作.不过常用的jvm都有gc,而且大多数gc都使用类似的算法管理内存和执行收集 ...
- 5、mysql的连接查询
1.内联查询 >inner join 或 join 2.外联查询 (1)左连接 >left outer join 或 left join (2)右连接 >right outer jo ...