https://vjudge.net/problem/UVA-10817

题意:

某校有m个教师和n个求职者,需讲授s个课程,已知每人的工资c和能教的课程集合,要求支付最少的工资使得每门课都至少有两名老师能教。

思路:

s1表示恰好有一个人教的科目集合,s2表示至少有两个人教的科目集合。

d[i][s1][s2]表示已经考虑了前i个人时的最小花费。参考了大神的代码,如下:

 #include<iostream>
#include<string>
#include<cstring>
#include<sstream>
#include<algorithm>
using namespace std; const int maxn = + ;
const int maxs = + ;
#define INF 100000000
int m, n, s;
int c[maxn], st[maxn];//数组c表示工资,st表示第i个老师教课的集合
int d[maxn][ << maxs][ << maxs]; int dp(int i, int s0, int s1, int s2)
{
if (i == m + n)
return s2 == ( << s) - ? : INF;//如果s2恰好等于全部课程的集合时,已经满足题意,不需要花钱
int& ans = d[i][s1][s2];
if (ans >= )return ans;
ans = INF;
if (i >= m) ans = dp(i + , s0, s1, s2);//不选第i个应聘者,由于选i应聘者会导致s0,s1,s2改变,因此先初始化成不选
int m0 = st[i] & s0;//只有第i个应聘者会教的课程
int m1 = st[i] & s1;//第i个应聘者也会教的课程
s0 ^= m0;//在s0集合中除去所有只有i应聘者会教的课程,即m0
s1 = (s1^m1) | m0;//m1代表的所有课程变为了至少两个人会教,从s1中除去,同时加上m0
s2 |= m1;//将m1添加到s2
ans = min(ans, c[i] + dp(i + , s0, s1, s2));//选第i个应聘者,取较小者
return ans;
} int main()
{
//freopen("D:\\txt.txt", "r", stdin);
while (~scanf("%d%d%d", &s, &m, &n) && s&&m&&n)
{
memset(d, -, sizeof(d));
memset(st, , sizeof(st));
getchar();
for (int i = ; i < m + n; i++)
{
string str;
getline(cin, str);
stringstream ss(str);
int x, flag = ;
while (ss >> x)
{
if (flag){ flag = ; c[i] = x; }
else
{
x--; //将科目从0开始编号
st[i] |= ( << x); //二进制的压缩存储
}
}
}
int ans = dp(, ( << s) - , , );
printf("%d\n", ans);
}
return ;
}

UVa 10817 校长的烦恼的更多相关文章

  1. UVA 10817 十一 Headmaster's Headache

    Headmaster's Headache Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Sub ...

  2. uva 10817(数位dp)

    uva 10817(数位dp) 某校有m个教师和n个求职者,需讲授s个课程(1<=s<=8, 1<=m<=20, 1<=n<=100).已知每人的工资c(10000 ...

  3. 状压DP UVA 10817 Headmaster's Headache

    题目传送门 /* 题意:学校有在任的老师和应聘的老师,选择一些应聘老师,使得每门科目至少两个老师教,问最少花费多少 状压DP:一看到数据那么小,肯定是状压了.这个状态不好想,dp[s1][s2]表示s ...

  4. UVa 10817 - Headmaster's Headache(状压DP)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  5. UVA 10817 - Headmaster's Headache(三进制状压dp)

    题目:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=20&pag ...

  6. uva 10817(状压dp)

    题意:就是有个学校要招老师.要让没门课至少有两个老师可以上.每个样样例先输入三个数字课程数量s,已经在任的老师数量,和应聘的老师数量.已经在任的一定要聘请. 思路是参考了刘汝佳书上的,关键如何状压. ...

  7. uva 10817

    Problem D: Headmaster's Headache Time limit: 2 seconds The headmaster of Spring Field School is cons ...

  8. UVa 10817 (状压DP + 记忆化搜索) Headmaster's Headache

    题意: 一共有s(s ≤ 8)门课程,有m个在职教师,n个求职教师. 每个教师有各自的工资要求,还有他能教授的课程,可以是一门或者多门. 要求在职教师不能辞退,问如何录用应聘者,才能使得每门课只少有两 ...

  9. UVa 10817 Headmaster's Headache (状压DP+记忆化搜索)

    题意:一共有s(s ≤ 8)门课程,有m个在职教师,n个求职教师.每个教师有各自的工资要求,还有他能教授的课程,可以是一门或者多门. 要求在职教师不能辞退,问如何录用应聘者,才能使得每门课只少有两个老 ...

随机推荐

  1. jmeter之Java request报错:java.lang.NoClassDefFoundError: redis/clients/jedis/Jedis

    今天在学习Jmeter的java request,请求内容是连接redis并获取其中的一个字段值.结果在运行时报如下错误: 2018/05/24 13:08:20 ERROR - jmeter.thr ...

  2. auto类型-现代C++新特性

    auto类型 C++11中引入的auto主要用于类型推导.auto在C++98中"存储类型指示符"的语义,由于使用极少且多余,该语义从C++11开始被删除. auto类型推导用于从 ...

  3. linux下面发布80端口的服务

    1:linux下面发布端口号为80 的服务,要在root用户下面发布.否则提示权限不够 2:在普通用户下面配置的java环境,在root用户下面不可用. 解决方法:2.1  要使用source /et ...

  4. SQL中常见语句

    SQL中常见语句笔记: --替换字段中的回车符和换行符 ) ), '') --删除表命令 DROP TABLE [dbo].[MGoods_Test] --删除表中数据命令 DELETE FROM [ ...

  5. eigen 笔记2

    4. Block operations 1) Using block operations Block of size(p, q), starting at (i, j) dynamic-size b ...

  6. EPD的驱动

    整个e-ink技术的生产流程:1997年从MIT媒体实验室走出来的E-INK公司成立并专注于研发具有良好阅读体验的电子纸.其中最著名的产品就是Vizplex 电子墨水.E-INK提供电子墨水给Pane ...

  7. input hidden的作用

    网上辣么多blabla的,我就总结一下 1 什么是hidden hidden 是input type的一个值,叫隐藏域,官方解释:“Hidden 对象代表一个 HTML 表单中的某个隐藏输入域. 这种 ...

  8. form中的fieldset标签应用

    不得不说,<fieldset>是个漂亮的家伙. 使用<fieldset>与<legend>可以设计出很好的表单. <style> fieldset:nt ...

  9. RocketMQ 集群搭建--双Master方案

    安装环境 jdk1.7 alibaba-rocketmq-3.2.6.tar.gz VM虚拟机redhat6.5-x64:192.168.1.201  192.168.1.202 Xshell4 部署 ...

  10. MATLAB 简明教程

    MATAB 是我学习和接触的第一种工具类的编程语言,最早可以追溯到大一上数学分析这门课的时候.MATLAB既是一种软件也是一门编程语言,MATLAB功能强大在理科和工科中运用较多. MATLAB 是 ...