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. windows使用方法

    1:截图搜索英文单词:snipping tool 2: 修改语言,搜索language 3:关闭fn键,按键 fn+esc(fnlock).  就可以将fn关闭和开启.

  2. oj2892(字典树)

    一改时间以后WA了,我就知道这题是考字典树,可惜代码怎么也不会敲了,郁闷. #include <stdio.h>#include <string.h>#include < ...

  3. SQLserver数据库连接问题

    可能安装好之后数据库的端口1433被防火墙拦截了,查看端口是否在监听当中: 在cmd里输入命令 :netstat -an 查看是否处在监听中,如果没有进入下面的设置, C:\Windows\SysWO ...

  4. 在 Angularjs 中 ui-sref 和 $state.go

    ui-sref 一般使用在 <a>...</a>: <a ui-sref="message-list">消息中心</a> $stat ...

  5. jmeter 正则表达式提取器的使用(提取第一个匹配结果)

    原文地址https://www.cnblogs.com/xueli/p/7405258.html?utm_source=itdadao&utm_medium=referral 正则表达式的用处 ...

  6. docker 批量删除容器和镜像

    docker 批量删除容器和镜像 1,删除单个镜像或者容器 docker  rmi  镜像ID/镜像名字:TAG docker  rm  容器ID/容器名字 1.停止所有的container,这样才能 ...

  7. matlab 绘制条状图形

    clear,clc;A=zeros(1080,1920,3);A(:,1:384,:)=0;A(:,385:768,:)=10;A(:,769:1152,:)=20;A(:,1153:1536,:)= ...

  8. Java的redis控制台-Jedis

    jedis 源码地址:https://github.com/xetorthio/jedis

  9. cxf的使用

    java的一个rest路径包含五个部分 1.容器路径,如tomcat的文件包名,jetty的context等 2.web.xml -配置cxf或者sevlet等 3.cxf.xml 4.具体的实现类中 ...

  10. nginx之全局设置,location,虚拟主机,日志管理

    nginx之全局设置,location,虚拟主机,日志管理 worker_processes 1;//子进程,cpu数*核数 ****************全局设置************** ** ...