题意:

一共有s(s ≤ 8)门课程,有m个在职教师,n个求职教师。

每个教师有各自的工资要求,还有他能教授的课程,可以是一门或者多门。

要求在职教师不能辞退,问如何录用应聘者,才能使得每门课只少有两个老师教而且使得总工资最少。

分析:

因为s很小,所以可以用状态压缩。

dp(i, s1, s2)表示考虑了前i个人,有一个人教的课程的集合为s1,至少有两个人教的集合为s2。

在递归的过程中,还有个参数s0,表示还没有人教的科目的集合。

其中m0, m1, s0, s1, s2的计算用到位运算,还是个不错的练习。

 #include <cstdio>
#include <string>
#include <iostream>
#include <cstring>
#include <sstream>
using namespace std; const int maxs = ;
const int maxn = ;
const int INF = ;
int s, m, n, c[maxn], st[maxn], d[maxn][<<maxs][<<maxs]; int dp(int i, int s0, int s1, int s2)
{
if(i == m+n) return s2 == (<<s)- ? : INF;
int& ans = d[i][s1][s2];
if(ans >= ) return ans;
ans = INF;
if(i >= m) ans = dp(i+, s0, s1, s2);
int m0 = st[i]&s0, m1 = st[i]&s1; //m0是该教师能教且现在没人教的科目,m1是能教且现在只有一个人教的集合
s0 ^= m0; s1 = (s1^m1)|m0; s2 |= m1;
ans = min(ans, c[i] + dp(i+, s0, s1, s2));
return ans;
} int main()
{
//freopen("in.txt", "r", stdin);
int x;
string line;
while(getline(cin, line))
{
stringstream ss(line);
ss >> s >> m >> n;
if(s == ) break; memset(st, , sizeof(st));
for(int i = ; i < m+n; ++i)
{
getline(cin, line);
stringstream ss(line);
ss >> c[i];
while(ss >> x) st[i] |= ( << (x-));
}
memset(d, -, sizeof(d));
printf("%d\n", dp(, (<<s)-, , ));
} return ;
}

代码君

UVa 10817 (状压DP + 记忆化搜索) Headmaster's Headache的更多相关文章

  1. UVa 1252 (状压DP + 记忆化搜索) Twenty Questions

    题意: 有n个长为m的各不相同的二进制数(允许存在前导0),别人已经事先想好n个数中的一个数W,你要猜出这个数. 每次只可以询问该数的第K为是否为1. 问采用最优询问策略,则最少需要询问多少次能保证猜 ...

  2. 状压DP+记忆化搜索 UVA 1252 Twenty Questions

    题目传送门 /* 题意:给出一系列的01字符串,问最少要问几个问题(列)能把它们区分出来 状态DP+记忆化搜索:dp[s1][s2]表示问题集合为s1.答案对错集合为s2时,还要问几次才能区分出来 若 ...

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

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

  4. [JZOJ5398]:Adore(状压DP+记忆化搜索)

    题目描述 小$w$偶然间见到了一个$DAG$. 这个$DAG$有$m$层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有$k$个节点. 现在小$w$每次可以取反第$i(1<i< ...

  5. loj 1021(状压dp+记忆化搜索)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25887 题目大意:给定的一个某进制下的排列,问它的全排列有多少个能 ...

  6. loj 1018(状压dp+记忆化搜索)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25844 思路:首先预处理出点在同一直线上的所有的点集状态(dp[i ...

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

    题意:有M个已聘教师,N个候选老师,S个科目,已知每个老师的雇佣费和可教科目,已聘老师必须雇佣,要求每个科目至少两个老师教的情况下,最少的雇佣费用. 分析: 1.为让雇佣费尽可能少,雇佣的老师应教他所 ...

  8. UVa 1252 Twenty Questions (状压DP+记忆化搜索)

    题意:有n件物品,每件物品有m个特征,可以对特征进行询问,询问的结果是得知某个物体是否含有该特征,要把所有的物品区分出来(n个物品的特征都互不相同), 最小需要多少次询问? 析:我们假设心中想的那个物 ...

  9. UVa 10599【lis dp,记忆化搜索】

    UVa 10599 题意: 给出r*c的网格,其中有些格子里面有垃圾,机器人从左上角移动到右下角,只能向右或向下移动.问机器人能清扫最多多少个含有垃圾的格子,有多少中方案,输出其中一种方案的格子编号. ...

随机推荐

  1. C# ASP.NET系统缓存全解析

    原文:http://blog.csdn.net/wyxhd2008/article/details/8076105 目录(?)[-] 系统缓存的概述 页面输出缓存 页面局部缓存 文件缓存依赖 数据库缓 ...

  2. 原生JS实现苹果菜单

    今天分享下用原生JS实现苹果菜单效果,这个效果的重点有以下几点 图标中心点到鼠标的距离的算法 利用比例计算图标的宽度 代码地址:https://github.com/peng666/blogs/blo ...

  3. XCode签名证书死活不能选

    Editors>Show Values on Xcode , then you can select the code sign instead of typing

  4. Problem 1007 幸运数 线段树成段更新

    题目链接: 题目 Problem 1007 幸运数 Time Limit: 2000 mSec Memory Limit : 131072 KB 问题描述 皮特的幸运数是2和5.只由幸运数字2和5组成 ...

  5. 新建标准mavenWeb工程以及Maven的web应用标准目录结构建议

    到现在为止,使用Maven结构的Web工程越来越多,因此在此介绍一下通过Maven来构建项目的相关知识.     文档主要分为两部分:       1.如何通过maven来构建多模块的web项目    ...

  6. SQLServer调试

    1.普通调试 直接点击SSMS客户端上的调试按钮即可 2.存储过程调试 2.1 定义存储过程(以Northwind数据库为例) USE [Northwind] GO /****** Object: S ...

  7. Asp.net 程序部署问题——在应用程序级别之外使用注册为 allowDefinition='MachineToApplicati错误信息

    [转]在应用程序级别之外使用注册为 allowDefinition='MachineToApplicati 错误信息: ======================================== ...

  8. LoadRunner 11 安装及破解(转)

    前提条件: 内存:2G,硬盘空闲空间10G,安装完成后实际只占不到2G 支持winXP  SP3;32位与64位win7浏览器支持IE6-8,IE9,firefox3 若以前安装过LoadRunner ...

  9. 你应该了解的jquery 验证框架

    Jquery validate 验证 具体查看附件中demo 主要是几种使用形式: 1.写在js中: $("#signupForm").validate({ rules: { fi ...

  10. POJ2752 Seek the Name,Seek the Fame KMP算法

    KMP继续练手.题目问的是一个串前缀等于后缀的可能长度是哪些,输出来.题目考的是对KMP失配指针的理解,当最后一位失配(即'\0'那里)时,指针会移动到前缀对应匹配的部分,所以这个长度是我们要的,然后 ...