大致题意就是:

一个学校招聘人,自带老师m个,n个求职的人,需要讲授s个课程,已经知道了每个人工资,问怎么才能让各科至少有两个老师(自带的必须要)

这题刚看的时候大概知道是要状态转移,可问题是,状态转移有点复杂,不知道应该怎么转移,后面看了题解之后,发现这个又是一个神奇的一道题目,dp状态压缩+记忆化搜索

我们在状态转移的时候遇到的问题是,不知道哪些课程是一个人还是两个人还是没有人

因为课程数很少所以完全可以用二进制来表示,但是这里需要用两个状态数S0,S1表示只有一个1或0个人的科目状态,如S0 : 010101 表示2,4,6没有人教

那么剩下的就是用01背包来写记忆化搜索了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<queue>
#include<cstdlib>
#include<algorithm>
#include<stack>
#include<map>
#include<queue>
#include<vector>
#include<sstream>
using namespace std;
const int maxn = 300;
const int INF = 1e9;
int m,n,c[maxn],s,st[maxn],d[maxn][1<<8][1<<8];
int dp(int i,int s0,int s1,int s2){
if(i==m+n) return s2==(1<<s)-1?0:INF;
int& ans = d[i][s1][s2];
if(ans >= 0) return ans; //初始化ans表示当前不选(同时默认了i<m的情况)
//因为i<m的时候不选是非法的,设置为无穷大,消除影响
ans = INF;
if(i >= m) ans = dp(i+1,s0,s1,s2); //在可选的情况下不选i int m0 = s0 & st[i], m1 = st[i] & s1; //st[i]中有多少是没人会的,有多少是一个人会的
//m0从s0晋级到s1,^是消除m0的意思
s0 ^= m0;
//m1是从s1晋级到s2的,消除s2,同时加上m0
s1 =(s1^m1) | m0; s2 |= m1; //加上m1
ans=min(ans,c[i]+dp(i+1,s0,s1,s2));
return ans;
}
int main(){
#ifdef LOCAL
freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
#endif
int x;
string line;
while(getline(cin,line)){
stringstream ss(line);
ss >> s >> m >> n;
if(s == 0) break;
for ( int i = 0; i < m+n; i++){
getline(cin , line);
stringstream ss(line);
ss >> c[i];
st[i] = 0;
while (ss >> x) st[i] |= (1 << (x-1));
}
memset(d, -1, sizeof d);
cout << dp(0, (1<<s)-1, 0, 0) << "\n"; }
return 0;
}


Uva10817_Headmaster's Headache的更多相关文章

  1. UVA 10817 十一 Headmaster's Headache

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

  2. UVA 10817 Headmaster's Headache(DP +状态压缩)

    Headmaster's Headache he headmaster of Spring Field School is considering employing some new teacher ...

  3. UVA10817-Headmaster's Headache(动态规划基础)

    Problem UVA10817-Headmaster's Headache Time Limit: 4500 mSec Problem Description Input The input con ...

  4. 状压DP UVA 10817 Headmaster's Headache

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

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

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

  6. Headmaster's Headache

    题意: s门课程,现任老师有m个给出工资,和他们能教的课,现在有n个应聘的老师,给出费用和能教的课程标号,求使每门课都至少有两个老师教的最小花费 分析: n个老师选或不选有背包的特征,n很小想到用状压 ...

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

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

  8. uva 10817 Headmaster&#39;s Headache 出发dp 位计算

    出发dp,用在一些议题的操作非常~  给出s个课程.m个教师.n个求职者,教师必须招聘.然后招聘一些求职者,使得每一门课都至少有两个老师能教.问题就转换成了招聘哪些求职者使得花费最少.由于s范围小于8 ...

  9. uva 10817 - Headmaster's Headache ( 状态压缩dp)

    本文出自   http://blog.csdn.net/shuangde800 题目链接: 点击打开链接 题目大意 某校有n个教师和m个求职者,已知每人的工资和能教的课程集合,要求支付最少的工资使得每 ...

随机推荐

  1. Boosting Ensemble and GBDT Algorithm

    Boosting Ensemble: 机器学习中,Ensemble model除了Bagging以外,更常用的是Boosting.与Bagging不同,Boosting中各个模型是串行的.其思想是,后 ...

  2. 1.如何在JMeter中使用JUnit

    您是否需要在测试过程中使用JUnit? 要回答这个问题,我们先来看看单元测试. 单元测试是软件测试生命周期中测试的最低分辨率. 运行单元测试时,需要在应用程序中使用最小的可测试功能,将其与其他代码隔离 ...

  3. 阮一峰 ES6

    阮一峰 ES6:http://es6.ruanyifeng.com/#docs/module

  4. 路由参数 query和params

    1. path:'www.baidu.com' query  { id:122 } 对应地址:http:'www.baidu.coom?id=122'   类似get方式 2.name:'baidu' ...

  5. 构建一个简单的Spring Boot项目

    11 构建一个简单的Spring Boot项目 这个章节描述如何通过Spring Boot构建一个"Hello Word"web应用,侧重介绍Spring Boot的一些重要功能. ...

  6. mac 支持rz sz

    安装 lrzsz brew install lrzsz 配置 iTerm2 安装完成后我们需要在 iTerm2 中使用的话,还需要一些配置 进入到 /usr/local/bin 目录下,下载两个脚本文 ...

  7. 第十章 Ingress

    一.资料信息 Ingress-Nginx github 地址:https://github.com/kubernetes/ingress-nginx Ingress-Nginx 官方网站:https: ...

  8. 转载:jQuery的deferred对象详解

    一.什么是deferred对象? 开发网站的过程中,我们经常遇到某些耗时很长的javascript操作.其中,既有异步的操作(比如ajax读取服务器数据),也有同步的操作(比如遍历一个大型数组),它们 ...

  9. PHP- 搜索插入位置

    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 输入: [1,3,5,6], 5输出 ...

  10. linux下各文件夹的结构及其用途说明

    bin 二进制可执行命令 dev 设备特殊问题 etc 系统管理和配置文件 etc/rc或etc/rc.d或etc/rc?.d启动或改变运行级时运行的脚本或脚本的目录 etc/passwd 用户数据库 ...