HDU 6006 Engineer Assignment (状态压缩DP)

【ROS】ROS局域网下多机通讯方法 最近工作中需要用到多机通讯,这里稍微总结一下使用方法。一、网络配置ifconfig这里举个例子,主机的IP地址为192.168.1.127,从机的IP地址为192.168.1.126;之后可测试一下能否互相ping通,成功后进行下一步。 阅读详情
/*
  一共有N个工作,M个人。每个工作需要某些领域的知识,每个人都有自己精通的领域。给这些工作分配人,要求每个人最多只能分配一项工作,每个工作的若干人所精通的知识必须包含了该工作的知识,
  问最多能分配几个工作。
  
  将人的集合表示成二进制
  dp[i][S]表示前i个工作,选的人的集合为S时,所完成任务的最大数量
  则有dp[i][S] = max( dp[i-1][S], dp[i-1][S ^ s] + 1 ), 其中s为S的子集,并且s所表示的人能够完成第i份工作
  
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 10;
vector<int> Work[maxn]; //每个工作所需的领域
vector<int> Peo[maxn];   //每个人精通的领域
vector<int> sets[maxn];  //sets[i]存储第i个工作可以由哪些人的集合来完成
bool Sets[maxn][1<<10]; //Sets[i][S]表示第i个工作是否可以由S集合来完成 (S为人的集合)
bool vis[105]; //领域,最多100个领域
int N, M;
int dp[maxn][1<<10];

void Input()
{
	for(int i = 0; i < 10; i++) { Work[i].clear(); Peo[i].clear(); sets[i].clear();}
	memset(Sets, false, sizeof Sets);
	int x, y;
    for(int i = 0; i < N; i++)
    {
    	scanf("%d", &x);
    	while(x--)
    	{
    		scanf("%d", &y);
    		Work[i].push_back(y);
    	}
    }

    for(int i = 0; i < M; i++)
    {
    	scanf("%d", &x);
    	while(x--)
    	{
    		scanf("%d", &y);
    		Peo[i].push_back(y);
    	}
    }
}

void Init()
{
	for(int S = 1; S < (1<<M); S++)
	{
		memset(vis, false, sizeof vis);
		for(int i = 0; i < M; i++) if(S & (1<<i))
		{
            for(int j = 0; j < Peo[i].size(); j++)
            	vis[Peo[i][j]] = true;
		}
		for(int i = 0; i < N; i++)
		{
			bool flag = true;
			for(int j = 0; j < Work[i].size(); j++) if(!vis[Work[i][j]])
			{
				flag = false;
				break;
			}
			if(flag) Sets[i][S] = true, sets[i].push_back(S);
		}
	}
}

void Solve(int &kase)
{
	int ans = 0;
	for(int i = 0; i < N; i++)
	  for(int S = 0; S < (1<<M); S++)
	  {
	  	  if(i == 0) { dp[i][S] = Sets[i][S]; ans = max(ans, dp[i][S]); continue; }
	  	  dp[i][S] = dp[i-1][S];
	  	  if(!Sets[i][S]) {ans = max(ans, dp[i][S]); continue;}
          for(int j = 0; j < sets[i].size(); j++)
          {
          	  int s = sets[i][j];
          	  if((S | s) == S)
          	    dp[i][S] = max(dp[i][S], dp[i-1][S ^ s] + 1);
          }
          ans = max(ans, dp[i][S]);
	  }
	  printf("Case #%d: %d\n", ++kase, ans);
}

int main()
{
	int T, kase = 0;
	scanf("%d", &T);
	while(T--)
	{
        scanf("%d%d", &N, &M);
        Input();
        Init();
        Solve(kase);
	}
}

Dev-C++使用技巧2(亲测)(更改字体和颜色、自动保存、快捷键选项、一键排版) 更改字体和颜色 顶部菜单栏->工具->编辑器选项。 更改字体 当前选项卡->显示,字体word有的基本都有,华文楷体、宋体,幼圆之类。西文字体默认字体Consloas就不错,中文的话幼圆、新宋体都挺不错。 幼圆效果: 新宋体效果: 更改颜色 当前选项卡->语法,分别单击图中的部分,然后在左边修改前景颜色就可以了。需要直接显示的修改前景颜色,背景颜色设为白色;需要选中显示的修改背景颜色,前景设为白色。 自动保存 我们有时候忘记保存或者电脑突然关机,可能会丢失代码。 阅读详情

相关推荐

嵌入式通讯协议全解析:UART、I2C、SPI、CAN与Modbus实战指南

通讯协议是嵌入式系统设计的核心基础,也是面试与工程实践中避不开的关键环节。从串口UART的异步收发,到I2C总线寻址与SPI高速全双工传输,再到RS485差分长距离通信、CAN总线多主仲裁机制,以及工业领域事实标准的Modbus RTU协议,每一种技术都对应着特定的应用场景与设计权衡。理解协议背后的物理层原理、时序特征和工程坑点,才能真正解决设备间通信的选型、调试与健壮性问题。本文从基础概念出发,系统梳理各类嵌入式通讯协议的工作机制,并结合实际代码示例与对比表格,帮助开发者在面对面试问题或项目设计时,构建从

weixin_42520573的博客 275

HDU6006 - (预处理+状压dp)

没写出来的原因多半是平时自己练太少了,其实很水的一个状压题解:预处理出每个地方可以有哪些人组合完成 dp[i][j]就表示前i个人在状态j的最大完成数量。#include <iostream> #include <cstring> #include <string> #include <algorithm> #include <cstdio> #include <cmath> #include <

yxmGo 1010

逆向工程实战:手把手教你破解药监局网站的动态数据加载机制(Python+Chrome开发者工具)

本文详细介绍了如何利用Python和Chrome开发者工具逆向破解药监局网站的动态数据加载机制。通过分析Ajax请求、解析JSON响应数据以及处理动态参数,帮助开发者高效采集动态加载内容,适用于爬虫开发与数据分析场景。

weixin_30832143的博客 67

H - Engineer Assignment HDU - 6006状压

题目大意: 有n个任务,每个任务有一些要求,有m个人,每个人可以解决一些要求,问你,最多可以完成多少任务。 分析: 由于n和m很小,我们可以考虑状压DP,首先,预处理出来每个任务所需的人数组合,然后进行dp dp[i][j]=max(dp[i-1][j-t[i][k]]+1,dp[i][j]); dp[i][j]=max(dp[i][j],dp[i-1][j]); #include &lt;ios...

CURRYWANG97的博客 557

强化学习-----DQN(Deep Q-network)

DQN(Deep Q-Network)是一种基于深度学习和强化学习的算法,由DeepMind提出,用于解决离散动作空间下的马尔科夫决策过程(MDP)问题。它是首个成功将深度学习应用于解决强化学习任务的算法之一。DQN,即深度Q网络(Deep Q-network),是指基于深度学习的Q-Learing算法。那什么是Q-leaning?可以看上一篇文章Q-learning是一种经典的强化学习算法,用于解决马尔可夫决策过程(Markov Decision Process,MDP)中的控制问题。

qq_74722169的博客 2万+

02-基于ART-PI开发板创建USB CDC 虚拟串口设备

本例在ART-PI开发板上,基于RT-Thread 5.0,5虚拟了一个USB32 CDC串口设备。

arm_fan的专栏 1885

HDU 6006 状压DP

题意给最多10个任务,每个任务完成需要一些技能,给最多10个工程师,每个工程师拥有一些技能。每个工程师只能完成一项任务,问最多可以完成多少任务。题解看到数据量只有10就应该想到是状压DP的,对于这道题我们发现技能状态很多而拥有工程师的状态很少。(因为最多只有10个工程师)我们这时候就要意识到要对工程师进行处理。我们可以枚举一下对于每个任务,哪些工程师能解决问题,需要注意处理掉工程师数量大于3的状态(

zhenlingcn的博客 481

[企业AI落地] RAG 知识库系统在多租户环境下的细粒度权限隔离设计

多租户 RAG 系统真正的风险不只是搜不到,而是把不该看到的内容查出来、说出来、写回去。本文结合多客户售后知识助手场景,用元数据结构、向量检索过滤、回答策略和审计回写示例拆解租户、资源、检索、生成、审计五层权限边界。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 219

HDU - 6006 Engineer Assignment (状压dfs)

题意:n个工作,m个人完成,每个工作有ci个阶段,一个人只能选择一种工作完成,可以不选,且只能完成该工作中与自身标号相同的工作阶段,问最多能完成几种工作。 分析: 1、如果一个工作中的某个工作阶段没有任何一个人能完成,则这个工作是不可完成的。 2、预处理每个人能完成各工作的各工作阶段。 3、剪枝:如果当前完成工作数+剩余人数<=ans则剪枝。 #include<...

Cherrychan2014的博客 217

化工管道设计软件:CAESAR II二次开发_(6).API接口与函数库

自定义函数库是开发者根据特定需求编写的函数集合。这些函数可以扩展CAESAR II的功能,实现更复杂的管道设计任务。自定义函数库通常需要开发者具备一定的编程基础,能够理解和编写与CAESAR II接口兼容的代码。定义函数:在Python或其他编程语言中定义所需的函数。注册函数:将自定义函数注册到CAESAR II的函数库中。调用函数:在CAESAR II中调用自定义函数,实现特定功能。假设我们需要创建一个自定义函数库,用于批量修改管道节点的坐标。定义函数:在Python中定义一个函数,用于批量修改节点坐标。

kkchenjj的博客 1728

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

HDU6006-Engineer Assignment

Engineer Assignment                                                                  Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)                            

wang_128的博客 1229

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

HDU 6006 Engineer Assignment(状态压缩dp)

看到数据范围这么的小,想了想搜索还是差了一点,于是就只能是状压了……         大致题意是,有n个项目,每个项目都涉及到一些领域,然后有m个专家,每个专家也都精通一些领域。规定每个专家只能参与一个项目,可以在一个项目中负责多个领域,然后每个项目一定得保证所有的领域至少都有一个人精通才能完成。问最后最多能够完成多少个项目。         我们发现专家总共只有10个,然后项目也最多只有10个,所以我们可以定义dp[i][s]表示对于前i个项目,我选用专家的状态为s的时候最多能够完成的项目个数。这里s是一

alpc_qleonardo 650

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

hdu 6006

HDU - 6006 Engineer Assignment 我参考了这份题解. 贴上我比较拙的代码,留念一下。 /** * 想到状态压缩的dp问题就解决了一半。 */ #include <stdio.h> #include <iostream> #include <algorithm> #include <vector> #include &...

weixin_30470643的博客 171

hdu 6006 Engineer Assignment 2016 ccpc final (状压dp)

题目链接 https://vjudge.net/problem/HDU-6006 题目大意 有nnn个工程和mmm个人,每个工程需要几个方面的人才,一个人在某几个方面精通,问同时最多可以进行多少个工程 (一个人只能参与一个工程) 题解思路 这道题的数据范围很小,考虑状压dp 用dp[i][sta]dp[i][sta]dp[i][sta]表示进行到第iii个工程,用了stastasta状态的人的最大...

neuq_zsmj的博客 222

hdu 6006 Engineer Assignment(状压dp)

题目链接Problem DescriptionIn Google, there are many experts of different areas. For example, MapReduce experts, Bigtable experts, SQL experts, etc. Directors need to properly assign experts to various pro

ciel_s的博客 1396

hdu 6006 Engineer Assignment(状压)

题目:here 主要思路:离散化之后进行状压dp #include #include #include #include using namespace std; typedef long long ll; const int maxn=1e5+5; int engi[15][5]; int pro[15][5]; int dp[15][1200]; int v

destiny546的博客 961

HDU 6006 Engineer Assignment:状压dp

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6006 题意:   在Google中,有个n项目,m个专家。第i个项目涉及c[i]个领域,分别为a[i][0]...a[i][c[i]-1]。第i个专家精通d[i]个领域,分别为b[i][0]...b[i][d[i]-1]。   如果要完成一个项目,则这个项目所涉及到的每一个领域都必须至...

a1392136的博客 157

HDU - 6006 Engineer Assignment(状压dp)

题目链接 题意:有n个任务,完成这些任务需要一些领域的知识。有m个工程师,每个工程师都有一些自己会的领域。每个工程师只能选择一个任务,若参与这项任务的工程师具备了完成所需的所有知识,这项任务则被完成。问最多能完成几个任务。 题解:题目给的n和m都很小,所以想到了状压DP去实现。dp[i][j]表示前i个任务在使用工程师j状态下最多能完成的任务个数。在维护dp状态之前,要额外跑一遍来确定能完成第i个任务的方案,用于最后的状态转移。 #include <bits/stdc++.h> using na

SsteelXD的博客 240

hdu 6006 Engineer Assignment(状压DP)

Engineer Assignment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 456    Accepted Submission(s): 149 Problem Description In Googl

MR CODER 426

hdu 6006 Engineer Assignment

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=6006题解:状态压缩+类背包dp代码:#include <cmath> #include <vector> #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm

silver_bone的博客 270

HDU6006(2016CCPC-Final H Engineer Assignment 状压dp)

题意: n(n<=10)个工程 m(<=10)个工程师。每个工程需要一些技术(技术个数<=3) 一个工程师精通一些技术(技术个数<=2) 。一个工程师只能去一个工程干活,一个工程师可以担任一个工程里的多个技术。问最多多少个工程可以开工。技术种类数<=100。 思路: dp[i][S]: 前 i 个工程,S表示1-m个工程师选与不选的状态。 dp[i][S]=max(d...

qq_42576687的博客 284

hdu6006 Engineer Assignment 状压dp

hdu6006 题意:有 n 个工程, m 个人,每个工程需要 ci 个领域的知识,每个人精通 di 个领域。每个人只能去一个工程,问最多可完成多少个工程。 tags:数据范围小,状压 dp[i][j] 代表前 i 个工程在状态 j 的组合下,最多能完成多少个工程。 首先预处理出每个工程可由哪些人组合完成,用 0 ~ ((1<<m)-1)记录。这里有点麻烦。。 然后就是 ...

weixin_30627381的博客 127

HDU - 6006 - Engineer Assignment (状压dp)

链接: http://acm.hdu.edu.cn/showproblem.php?pid=6006 题意: 一个项目需要一个或多个技能,一个人拥有一个或多个技能,给出项目和人的详情,问最多能完成多少项目。 思路: 状压dp。 先预处理出能第i个任务可以由哪些人一起完成,所以可以用状态压缩,然后dp[i][j]来表示表前i个任务,状态为j时,最多完成的任务数 #include &l...

刘二狗的博客 367

Engineer Assignment HDU - 6006

状压dp关键是直接对每个项目预处理完成需要的人选 还有就是位运算一定要加括号#include <iostream> #include <algorithm> #include <sstream> #include <string> #include <queue> #include <cstdio> #include <map> #include <set> #include <utility>

sb的博客 334

Engineer Assignment HDU - 6006(状压dp)

Problem Description In Google, there are many experts of different areas. For example, MapReduce experts, Bigtable experts, SQL experts, etc. Directors need to properly assign experts to various proje

退役的铜牌狗 382

HDU6006 Engineer Assignment 状压DP

简略题意:n个项目,m个工程师,每个工程师可以提供Di种技术支持,每个项目需要Ci种技术,每个工程师只能属于一个项目。问最多能完成几个项目。因为每个工程师只能被用一次,那么根据当前还剩哪些工程师空闲,我们就可以知道当前这个项目能不能被完成。 用dp[i][j]代表当前处理到第i个项目,还剩下的工程师集合是j。 转移有两种: 1. 不做当前的项目, dp[i+1][j] = dp[i][j]。

即使摸爬滚打,满身泥泞,我也要前进 296
上一篇: POJ 3261 Milk Patterns (后缀树组)
下一篇: HDU 4035 Maze (概率DP)
Interstellar_
博客等级 码龄10年 8粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值