Engineer Assignment(暴力+状压dp)
题意:
n个工程,m个研究员,每个工程需要Ci个领域(X1,X2..Xci)的研究员 ,每个研究员会Di个不同的领域(X1,X2..Xdi),要完成一个工程必须使得分配给这个工程的研究员覆盖了这个工程所需的所有领域。问如何分配研究员可以使能供完成的工程数最多?
n,m<=10;Ci<=3;Di<=2;
思路:
由于n很小,可以枚举出一个工程分配的所有方案(\(2^{11}-1\)),其中人员>3的方案可以舍弃(一定不是最优的)。将状态压缩为1~\(2^{11}-1\)的数,从第一个工程到第n个进行状压dp即可。
#include<bits/stdc++.h>
using namespace std;
const int maxn=20;
int c[maxn],d[maxn];
int a[maxn][10],b[maxn][10];
int dp[maxn][1<<11];
int vis[120];
vector<int>V[maxn];
int t,n,m;
void init(){
for(int i=1;i<=n;i++)
V[i].clear();
memset(dp,0,sizeof(dp));
}
int main(){
cin>>t;
for(int kase=1;kase<=t;kase++){
scanf("%d%d",&n,&m);
init();
for(int i=1;i<=n;i++){
scanf("%d",&c[i]);
for(int j=1;j<=c[i];j++){
scanf("%d",&a[i][j]);
}
}
for(int i=1;i<=m;i++){
scanf("%d",&d[i]);
for(int j=1;j<=d[i];j++){
scanf("%d",&b[i][j]);
}
}
for(int i=1;i<=n;i++){
for(int j=0;j<1<<m;j++){//枚举方案数
memset(vis,0,sizeof(vis));
int cnt=0;
for(int k=0;k<m;k++){//判断集合中有哪些人
if((1<<k)&j){//有id为k+1的人
for(int l=1;l<=d[k+1];l++){
vis[b[k+1][l]]=1;
}
cnt++;
}
}
if(cnt>3)continue;
int flag=1;
for(int k=1;k<=c[i];k++)
if(vis[a[i][k]]==0)
flag=0;
if(flag)V[i].push_back(j);
}
}
for(int i=1;i<=n;i++){
for(int j=0;j<1<<m;j++){
dp[i][j]=dp[i-1][j];
for(auto k:V[i]){
if((j|k)==j){//k属于j
dp[i][j]=max(dp[i-1][j-k]+1,dp[i][j]);
}
}
}
}
printf("Case #%d: %d\n",kase,dp[n][(1<<m)-1]);
}
}
Engineer Assignment(暴力+状压dp)的更多相关文章
- 【HDU 6006】Engineer Assignment(状压DP)
Problem Description In Google, there are many experts of different areas. For example, MapReduce exp ...
- HDU 6006 Engineer Assignment:状压dp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6006 题意: 在Google中,有个n项目,m个专家.第i个项目涉及c[i]个领域,分别为a[i][0 ...
- HITOJ 2662 Pieces Assignment(状压DP)
Pieces Assignment My Tags (Edit) Source : zhouguyue Time limit : 1 sec Memory limit : 64 M S ...
- HDU1074:Doing Homework(状压DP)
Doing Homework Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- Engineer Assignment HDU - 6006 状压dp
http://acm.split.hdu.edu.cn/showproblem.php?pid=6006 比赛的时候写了一个暴力,存暴力,过了,还46ms 那个暴力的思路是,预处理can[i][j]表 ...
- CCF 201312-4 有趣的数 (数位DP, 状压DP, 组合数学+暴力枚举, 推公式, 矩阵快速幂)
问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高 ...
- UVaLive 6625 Diagrams & Tableaux (状压DP 或者 DFS暴力)
题意:给一个的格子图,有 n 行单元格,每行有a[i]个格子,要求往格子中填1~m的数字,要求每个数字大于等于左边的数字,大于上边的数字,问有多少种填充方法. 析:感觉像个DP,但是不会啊...就想暴 ...
- 排列perm HYSBZ - 1072(状压dp/暴力)
Description 给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0).例如123434有90种排列能被2整除,其中末位为2的有30种,末位为4的有60种. Input ...
- 「状压DP」「暴力搜索」排列perm
「状压DP」「暴力搜索」排列 题目描述: 题目描述 给一个数字串 s 和正整数 d, 统计 sss 有多少种不同的排列能被 d 整除(可以有前导 0).例如 123434 有 90 种排列能被 2 整 ...
随机推荐
- qt 如何使用私有类?
在模块后面加上 -private 关键字,例如 widgets-private 然后 qmake 让配置文件运行一下. 在使用 QStackedLayout 布局并设置 QStackedLayout: ...
- Xshell实现Windows和使用跳板机跳转的远程Linux互传文件
适用于Linux CentOS版本,本地电脑是Win10版本 查询Linux版本: $lsb_release -a $cat /etc/issue 1.使用Xshell 连接上服务器 2.安装文件传输 ...
- C中对整数的大端对齐与小端对齐的理解
示例 /* 大端与小端对齐 说明: 1.对于arm, intel这种x86架构的复杂指令cpu,整数在内存中是 倒着存放的,低地址放低位,高地址放高位,称之为小端对齐 2.对于linux服务器的cpu ...
- show all privileges from a user in oracle
SELECT * FROM USER_SYS_PRIVS; SELECT * FROM USER_TAB_PRIVS; SELECT * FROM USER_ROLE_PRIVS; SELECT * ...
- ubuntu16.04的一系列安装
1.安装ubuntu https://blog.csdn.net/weixin_40494464/article/details/81010256 2.ubuntu里选择简体中文 https://bl ...
- Sass:Opacity函数-alpha()、opacity()函数
alphpa() 和 opacity() 函数很简单,与前面介绍的 red(),green() 等函数很类似.这个函数的主要功能是用来获取一个颜色的透明度值.如果颜色没有特别指定透明度,那么这两个函数 ...
- Windows 搭建MongoDB分片集群(二)
在本篇博客中我们主要讲描述分片集群的搭建过程.配置分片集群主要有两个步骤,第一启动所有需要的mongod和mongos进程.第二步就是启动一个mongos与集群通信.下面我们一步步来描述集群的搭建过程 ...
- phpstorm 各种报错
1.启动时报错 Failed to load module "canberra-gtk-module" 解决方法:libcanberra-gtk-module sudo apt-g ...
- 使用Navicat for Oracle新建表空间、用户及权限赋予
Navicat for Oracle是有关Oracle数据库的客户端工具.通过这个客户端,我们可以图形方式对Oracle数据库进行操作. 说 明我们此次试验的Oracle数据库版本是Oracle ...
- Arthas阿里开源的 Java 诊断工具
当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 1.这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 2.我改的代码为什么没有执行到?难道是我没 commi ...