大致题意就是:

一个学校招聘人,自带老师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. Cocos2d Box2D之动态刚体

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. b2_dynamicBody 动态物体可以进行全模拟.用户可以用手手动移动动态刚体,也可以由动态刚体自己受力而自运动.动态物体可以和任何物 ...

  2. struct和class的相同点与不同点

    struct是c语言中常用来定义结构体时使用的 class是c++中用来定义类时所使用的 相同 struct(结构体)和class(类)内均可有不同个数.不同类型的数据 定义时 都必须在前面加上str ...

  3. vue动态组件 互相之间传输数据 和指令的定义

    地址:https://blog.csdn.net/zhanghuanhuan1/article/details/77882595 地址:https://www.cnblogs.com/xiaohuoc ...

  4. easyUI学习笔记一

    1.引用js文件 <script type="text/javascript" src = jquery-easyui/jquery.min.js> </scri ...

  5. 空类的sizeof,有一个虚函数的类的sizeof

    今天面试,忽然被问到这个题目,查了一下果然有欸. #include <iostream> using namespace std; class A { }; class B { publi ...

  6. Primeng UI框架ionic3 中下拉选择插件p-dropdown 插件的使用方法

    1.html引入: <p-dropdown float-right [options]="sortOption" [(ngModel)]="sortNow" ...

  7. Centos 7 安装openjdk8

    一.使用yum命令搜索支持jdk版本 yum search java|grep jdk 二.使用yum安装jdk8 yum install -y java--openjdk 三.检查是否成功 java ...

  8. 用python编写排序算法

    交换排序 === 冒泡排序,快速排序 插入排序 ===直接插入排序,希尔排序 选择排序 === 简单选择排序,堆排序 归并排序 基数排序 冒泡排序 要点 冒泡排序是一种交换排序. 什么是交换排序呢? ...

  9. Codeforces 1179D 树形DP 斜率优化

    题意:给你一颗树,你可以在树上添加一条边,问添加一条边之后的简单路径最多有多少条?简单路径是指路径中的点只没有重复. 思路:添加一条边之后,树变成了基环树.容易发现,以基环上的点为根的子树的点中的简单 ...

  10. 【转】SQLSERVER磁盘原理

    [声明:本篇博客转载自http://www.cnblogs.com/ljhdo/p/5149401.html] 最近一段时间的工作主要是与SQLSERVER数据库打交道,需要对SQLSERVER有一个 ...