UVA 10817 Headmaster‘s Headache(最优配对问题,DP,状态压缩)

Markdown编辑器介绍 这篇文章介绍了Markdown编辑器的功能和使用方法。主要内容包括:Markdown的基本语法如标题、列表、链接插入等;新增功能如图片拖拽、数学公式支持、甘特图和UML图表绘制;常用快捷键说明;以及文本导出导入操作。文章详细说明了如何通过Markdown语法实现文本格式化、代码高亮、表格创建等功能,并提供了多种图表绘制的语法示例,帮助用户更好地利用Markdown编辑器进行写作和内容创作。 阅读详情

UVA 10817 Headmaster’s Headache(最优配对问题,DP,状态压缩)

题目大意:有m个在校老师,n个求职者,s个课程,给出每个人的工资和授课集合,在校老师必须聘请,每个课程匹配至少两名老师,求最少工资开销。

咋一看,我的思路是用d(i,S)表示考虑前i个课程和集合S中的教师和求职者完成配对的最少工资开销,然后发现不行,状态转移表示不出来,而且集合无法用二进制表示。

参考了紫书上的分析,我发现我还是太年轻了。紫书上用d(i,s1,s2),表示考虑了前i个人,集合s1表示当前状态有且仅有一个人教的课程,集合s2表示至少有两个人教的课程。
那么就可以很轻松地写出状态转移方程:
d(i,s1,s2)=min(d(i+1,s1’,s2’)+c[i],d(i+1,s1,s2))
第一项表示选择第i个人后,课程状态随之变更到s1’和s2’。c[i]表示第i个人的工资。
第二项表示不选择第i个人,课程状态不变

因为课程至多有8个,所以可以用二进制来表示一个集合。对于某一个集合s0,如果添加一个编号为i的课程,s0=s0|(1<<i-1);删除一个编号为i的课程,s0=s0^(1<<i-1);查询一个编号为i的课程,s0&(1<<i-1);状态转移可以通过一系列的位运算来轻易实现。

问题:为什么状态转移是从i转移到i+1?
一开始我很是疑惑,后来我发现其实i-1转移到i也是可以的,但是考虑的因素要多一些。
对于i转移到i+1,我们只用考虑和变更没人教的课程集合s0和只有一个人教的课程集合s1,而对于至少有两个人教的课程集合s2则不用考虑只需无脑变更就行,因为没限制至多有几个人教。所以递归结果是i=1,递归边界是i=m+n。
对于从i-1转移到i,我们则需要逆着去变更课程集合,而且递归边界不一定是i=1,也可能是s0为全集,因为递归起点是d(m+n,0,(1<<s)-1),即s2为全集表示所有课程都有且仅有两个人教,注意这里不是表示至少有两个人教。则自然的递归边界为d(i,0,0)。但是还要考虑在职教师,如果s0为全集而在职教师未完全聘请完,还要继续递归;所以要将在职教师放在栈的上端,且递归边界复杂不易判断。

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int max_n=(1<<8)+5;
const int INF=0x3f3f3f3f;
int s,m,n;
int c[125];
int si[125];
int d[125][max_n][max_n];
int dp(int i,int s0,int s1,int s2)//第一种dp函数
{
	if(i==m+n+1)return s2==(1<<s)-1?0:INF;
	int &ans=d[i][s1][s2];
	if(ans!=-1)return ans;
	ans=INF;
	if(i>m)ans=dp(i+1,s0,s1,s2);
	int cur_s0=s0^(s0&si[i]);
	int cur_s1=(s1^(s1&si[i]))|(s0&si[i]);
	int cur_s2=s2|(s1&si[i]);
	ans=min(ans,dp(i+1,cur_s0,cur_s1,cur_s2)+c[i]);
	return ans;
}
//int dp_1(int i,int s1,int s2)//第二种dp函数
//{
//	if(i==m+n+1)return s2==(1<<s)-1?0:INF;
//	int &ans=d[i][s1][s2];
//	if(ans!=-1)return ans;
//	ans=INF;
//	if(i>m)ans=dp(i+1,s1,s2);
//	int cur_s1=s1^st[i];
//	int cur_s2=s2|(s1&st[i]);
//	ans=min(ans,dp(i+1,cur_s1,cur_s2)+c[i]);
//	return ans;	
//}
int main(void)
{
//	freopen("in.txt","r",stdin);
//	freopen("out.txt","w",stdout);
	while(~scanf("%d%d%d",&s,&m,&n)&&s)
	{
		memset(si,0,sizeof(si));
		getchar();
		for(int i=1;i<=m+n;i++)
		{
			stringstream ss;
			string a;
			getline(cin,a);
			ss<<a;
			ss>>c[i];
			int c;
			while(ss>>c)
			si[i]+=1<<(c-1);
		}
		memset(d,-1,sizeof(d));
		printf("%d\n",dp(1,(1<<s)-1,0,0));
//		printf("%d\n",dp_1(1,0,0));
	}
//	fclose(stdin);
//	fclose(stdout);
}
//2 2 2
//10000 1
//20000 2
//30000 1 2
//40000 1 2
//0 0 0
//4 3 10
//1000 1 2 
//1000 3 
//1000 1 
//5000 1 2 3 4 
//50000 3 
//50000 4 
//50000 3 4 
//50000 1 
//50000 1 
//50000 2 
//50000 1 
//50000 2 
//50000 1 

代码给出了两种dp函数,第二种dp函数忽略了s0,直接计算s1。这种办法会将一个本已经由两个人教的课程重新放进s1,按照上面的状态定义s1和s2的交集应该为空,但是最后递归边界只对s2进行考察,所以s1是否正确其实无所谓。

零基础学习CANoe Panel(5)——改变变量的值,控件图像也改变,这是怎么回事? Panel 中控件的图像随着值变化,是怎么回事? 阅读详情

相关推荐

SpyGlass Lint脚本实战:如何用TCL自动化RTL代码检查(附完整配置模板)

本文详细介绍了如何利用TCL脚本实现SpyGlass Lint工具的自动化RTL代码检查。通过构建模块化、工程化的脚本框架,文章提供了从环境搭建、核心配置、规则定制到豁免管理的完整实战指南,并附有可复用的配置模板,旨在帮助IC设计工程师构建高效、一致的代码质量检查流水线。

weixin_29204205的博客 134

[集合DP] UVa10817 校长的烦恼(多阶段决策)

题目 思路 依然是集合DP的基本思路,此处的集合是课程的集合。 用s0表示没人教的课程集合,s1表示恰好有一个人教的课程集合,s2表示有至少两个人教的课程集合。由于s0可以由s1和s2算出来,所以不用记录在状态里。(虽然状态很复杂,但能简单一些是一些) 所以用d(i,s1,s2)表示前i个人,在s1,s2情况下的最小花费。此处应该注意的是,子集二进制表示法要求元素由0开始,题目给的...

OI - IceCab 288

超聚变安装银河麒麟服务器系统ky10-server-x86

超聚变-通过BMC口进服务器管理界面如下图为BMC管理口:默认BMC口IP:https://192.168.2.100l浏览器打开网页,输入用户名和密码登陆后,如下图红框处,选择“启动虚拟控制台”——选择“HTML集成远程控制台”系统银河麒麟服务器系统ky10 server x86选择镜像文件X86架构我们一般选择下图2212版本选择启动方式:光驱重启出现安装图形化界面选装安装系统的磁盘系统安装盘选完后如下图,会置灰创建root密码开始安装系统首次进入,有协议界面。

zengliguang的专栏 5960

UVA10817 Headmaster's Headache (状压DP)

题目网址:https://vjudge.net/problem/UVA-10817 题意: S门课程,M个教师,N个待聘教师。每个教师都有工资数和能够教授课程种类,要求在M个教师全部选择的基础上,再选择性的雇佣一部分待聘教师,在保证S门课程都至少有2人教授的前提下,付出的工资最少。s&lt;8 思路:  我们通过课程信息来确定最终结果,用三个状态s0,s1,s2的二进制位来代表课程当前的状...

DS00HY的小博客 355

unity pc运行包导入glb

本文介绍了在Unity中实现GLB/GLTF模型动态导入的方法。主要使用glTFast插件进行模型导入,配合StandaloneFileBrowser实现文件选择功能。文章提供了详细的插件安装方式(包括国内镜像源),并给出了核心导入脚本代码。脚本实现了模型加载、父对象设置、材质修复等功能,解决了常见的材质显示异常问题。该方法支持编辑器和PC平台,兼容不同版本的glTFastAPI,通过简易UI操作即可完成模型导入,适合需要运行时加载3D模型的Unity项目开发。

懒懒的蓝的博客 543

常见消息队列:ActiveMQ、RabbitMQ、RocketMQ、Kafka的区别总结

常见消息队列:ActiveMQ、RabbitMQ、RocketMQ、Kafka的区别。

qq_30713721的博客 3471

UVA 10817 Headmaster's Headache

题目大意:有一个学校要招老师,给你s门课,m个现役的老师,给你这m个老师分别教哪些课和他们的cost,现役的老师必须要继续留着,然后再给你n个应聘者,分别给你这n个人教哪些课和他们的cost,现在要求每门课至少要有两个老师教,问你最少的cost。 思路:基础的三进制的状态压缩DP吧,基本思想和二进制一样,只是这里需要多处理一下,用num[ i ][ j ] 表示数 i 如果用三进制表示,那么第

沉溺的专栏 879

机器学习项目实战案例数据集

本专栏整理了《机器学习项目实战案例》,内包含了各种不同的机器学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。

优快云 精品推荐 3635

UVA10817[Headmaster's Headache] 状态压缩动态规划

UVa10817 状态压缩动态规划

Venishel的博客 365

『杭电1199』Color the Ball

Problem Description There are infinite balls in a line (numbered 1 2 3 ....), and initially all of them are paint black. Now Jim use a brush paint the balls, every time give two integers a b and follow by a char 'w' or 'b', 'w' denotes the ball from a to

漠宸离若的博客 497

(持续更新中!)详解【计算机类&面试真题】军队文职考试 ——第二期(真题+解析)| 网络协议的三个核心要素;交互式系统中的非剥夺策略;中断和陷入的区别;可变分区管理中的硬件机制;数据库系统的优点

本篇博客将讨论军队文职面试(计算机类)的几个关键问题。我们将介绍网络协议的核心要素(帮助你理解网络通信的基本原理)、交互式系统中的非剥夺策略(解释为何这是一个优秀的策略以及其对用户体验、系统稳定性和可预测性的影响)、中断和陷入的区别(从引起原因、处理机制、权限级别和应用等方面进行阐述)、可变分区管理的硬件机制以及数据库系统与文件系统的优点比较。通过阅读本文,您将深入了解这些话题,为面试准备和实际应用提供有价值的知识。

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 1705

【Bugku-web】HEADache

2.在kali中输入以下命令:curl http://82.157.146.43:14340/ -H "Wanna-something: can-i-have- a-flag-please"3.回车后,得到flag值,提交。

weixin_73625393的博客 1264

RK3568移植AP6256

本文主要是记录RK3568移植正基的AP6256的WIFIBT模块,感兴趣的朋友可以一起学习!!!提示:以下是本篇文章正文内容,下面案例可供参考。

qq_24093081的博客 3715

【题解】UVA10817:Headmaster‘s Headache

@vjudge 记录有0、1、2个老师教的课的状态s0,s1,s2s0,s1,s2s0,s1,s2,并记录当前枚举到第几个老师ttt dfs(t,s0,s1,s2)dfs(t,s0,s1,s2)dfs(t,s0,s1,s2) 用记忆化,状态方面,s0,s1,s2s0,s1,s2s0,s1,s2中保存两个就好了,剩下一个用另外两个算出来,所以状态合理 Code: #include <bits/stdc++.h> #define maxn 310 #define maxm 210 using nam

ModestCoder_的博客 470

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

UVA 10817-Headmaster’s Headache(状态压缩DP)

题目大意:有S(S 用d[i][j]表示前i名老师状态为j的情况下最少的花费,j是S位三进制数,对于每一位三进制位u,为0时表示课程u当前没有老师教,为1表示课程u当前有一名老师教,为2表示课程u当前有两名老师教。最终答案为d[N][3^S-1]。 计算d[i][j]时,考虑是否雇佣第i位老师完成状态转移,如果雇佣,那么尽量充分利用这个老师所教的课程,对于这个老师教的每一门课,如果当前

dilemma的专栏 1030

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

UVa 10817 Headmaster‘s Headache 【01背包 位运算】

题意:刘汝佳训练指南p95 题解:此题可以设dp[s2][s1] = 授课状态为s2、s1时的最小花费(s1为课程授课状态为1的集合,s2为授课状态为2的集合) 然后视招募的新老师为要装进背包里的物品,授课状态s2,s1为容量,最终答案就为dp[(1 具体转移方程如下: 设s2,s1为招募该老师前的状态,ns2,ns1为招募该老师后的状态则,ns1 = s1 | s ,ns2 =

t51645的博客 448

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

UVA10817 校长的烦恼 Headmaster‘s Headache

题意:校长的烦恼 Headmaster’s Headache s很小,不难想到用状态压缩处理。但是我对状态压缩的应用还是固守在了处理棋盘上,一开始想的是把每门学科用两位二进数表示,但是没法做状态转移。 正解:用两个二进数表示当前状态,第一个数s1表示恰有一个人教的学科集合(某一位为0表示不在集合中,某一位为1表示在集合中),另一个数表示至少有两个人教的学科的集合,d(i,s1,s2)表示已经考虑了前i-1个人时(前i-1人聘用情况确定即s1s2确定,后面人的聘用情况任意)此状态下的最小花费,答案为d(1,.

gyp0205的博客 186

UVa10817 Headmaster's Headache

还是集合状态压缩dp,有了前面的经验,已经相对好写了。dp(i)

A Cube Master 755

UVA 10817 Headmaster's Headache

状态压缩dp,用两位二进制来表示一门课的信息。 code: #include #include #include #include #include using namespace std; #define clr(a,b) memset((a),b,sizeof(a)) const int maxn = 10010; typedef long long lld;

角落里的阳光 659

UVA - 10817 Headmaster's Headache (状压dp+记忆化搜索)

题意:有M个已聘教师,N个候选老师,S个科目,已知每个老师的雇佣费和可教科目,已聘老师必须雇佣,要求每个科目至少两个老师教的情况下,最少的雇佣费用。 分析: 1、为让雇佣费尽可能少,雇佣的老师应教他所能教的所有科目。 2、已聘老师必须选,候选老师可选可不选。 3、dfs(cur, subject1, subject2)---求出在当前已选cur个老师,有一个老师教的科目状态为subjec...

weixin_30367169的博客 79

uva 10817(状态压缩)

题意:一个学校要招聘老师,s门课,已应聘了m个老师,且有n个老师来应聘,给出了m个老师的工资和教哪几门课,和n个应聘者的工资和教哪几门课,要求所有科目至少有两个老师教,问最少花费。 题解:用状态压缩表示所有科目是否有老师教,因为每门课最少两个老师,所以状态要用s * 2个位表示,先初始化所有状态为1,然后先输入m的老师信息,将工资和存起来,然后把科目状态更改为0,然后输入n个应聘者的信息,c

俯瞰风景 935

UVa10817

题目大意 某校有n个教师和m个求职者,已知每人的工资和能教的课程集合,要求支付最少的工资使得每门课都至少有两名教师教学。在职教师必须招聘。 思路 这题不太好想,搞了很久。。 f[s1][s2]: s1表示课程集合{ s1 }都至少有一个教师教的情况。                s2表示课程集合{ s2 }都至少有两个教师教的情况。 每个求

Dosth_Magic 574

UVA 10817 状压DP

题意m个教师,n个求职者,需要教授s门课程,每人的工资为c,每门课程最少要有两名教师,已有的教师不能辞退。求最少需要支付的工资。题解该题是一道集合DP(状压DP)题,用二进制数位表示集合状态。dp[i][s1][s2]为已经考虑了前i个人,恰好有一个人教的科目集合状态为s1,有两个人教的科目集合状态为s2,所需要的最小费用。i>=m时,可以选择聘用该求职者,也可以选择不聘用该求职者。因此状态转移方程

zhenlingcn的博客 345

uva 10817 - Headmaster's Headache 校长的烦恼

题目: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=465&page=show_problem&problem=1758 显而易见的背包问题+集合动归 关键是集合不是一般的集合,每门课的状态有三种:没有老师,有了1个老师,有两个及以上。 1.我的办法

便纵有千种风情 588

uva 10817(数位dp)

uva 10817(数位dp) 某校有m个教师和n个求职者,需讲授s个课程(1<=s<=8, 1<=m<=20, 1<=n<=100)。已知每人的工资c(10000<=c<=50000)和能教的课程集合,要求支付最少的工资使得每门课都至少有两名教师能教。在职教师不能辞退。 用两个集合,s1表示恰好有一个人教的科目集合,s2表示至少有两个...

196

UVa 10817 校长的烦恼

https://vjudge.net/problem/UVA-10817 题意: 某校有m个教师和n个求职者,需讲授s个课程,已知每人的工资c和能教的课程集合,要求支付最少的工资使得每门课都至少有两名老师能教。 思路: s1表示恰好有一个人教的科目集合,s2表示至少有两个人教的科目集合。 d[i][s1][s2]表示已经考虑了前i个人时的最小花费。参考了大神的代码,如下: ...

weixin_30492047的博客 194
上一篇: UVA 1218 Perfect Service (树上 DP)
下一篇: UVA 1252 Twenty Question (集合DP,时间优化)
WedsonLin
博客等级 码龄7年 1粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值