UVA - 10817 Headmaster's Headache (状压dp+记忆化搜索)
题意:有M个已聘教师,N个候选老师,S个科目,已知每个老师的雇佣费和可教科目,已聘老师必须雇佣,要求每个科目至少两个老师教的情况下,最少的雇佣费用。
分析:
1、为让雇佣费尽可能少,雇佣的老师应教他所能教的所有科目。
2、已聘老师必须选,候选老师可选可不选。
3、dfs(cur, subject1, subject2)---求出在当前已选cur个老师,有一个老师教的科目状态为 subject1,有两个及以上老师教的科目状态为 subject2的情况下,最少的雇佣费用。
dp[cur][subject1][subject2]---在当前已选cur个老师,有一个老师教的科目状态为 subject1,有两个及以上老师教的科目状态为 subject2的情况下,最少的雇佣费用。
4、如果第cur个老师选择,则若他能教的科目和在subject1中所对应的科目都为1,那将该科目变为能被两个老师教。
subject1 & teacher[cur] --- 筛选出这个老师能教的科目中,目前只有一个老师教的科目---让这个老师去教这些科目的话,这些科目就被两个老师教了。
subject2 |= (subject1 & teacher[cur]);---将能被两个老师教的科目并到集合里。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#define lowbit(x) (x & (-x))
const double eps = 1e-8;
inline int dcmp(double a, double b){
if(fabs(a - b) < eps) return 0;
return a > b ? 1 : -1;
}
typedef long long LL;
typedef unsigned long long ULL;
const int INT_INF = 0x3f3f3f3f;
const int INT_M_INF = 0x7f7f7f7f;
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;
const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};
const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};
const int MOD = 1e9 + 7;
const double pi = acos(-1.0);
const int MAXN = 120 + 10;
const int MAXT = 300 + 10;
using namespace std;
int cost[MAXN];
int teacher[MAXN];
int dp[MAXN][MAXT][MAXT];
string s;
int S, M, N;
int dfs(int cur, int subject1, int subject2){
if(cur == M + N){
return subject2 == (1 << S) - 1 ? 0 : INT_INF;
}
int &ans = dp[cur][subject1][subject2];
if(ans >= 0) return ans;
ans = INT_INF;
if(cur >= M) ans = dfs(cur + 1, subject1, subject2);//第cur个老师不选
subject2 |= (subject1 & teacher[cur]);//第cur个老师选
subject1 |= teacher[cur];//将这个老师能教的科目中,目前没人教的科目,让他教
ans = min(ans, cost[cur] + dfs(cur + 1, subject1, subject2));
return ans;
}
int main(){
while(scanf("%d%d%d", &S, &M, &N) == 3){
if(!S && !M && !N) return 0;
for(int i = 0; i < M + N; ++i){
scanf("%d", &cost[i]);
getline(cin, s);
stringstream ss(s);
int x;
teacher[i] = 0;
while(ss >> x){
teacher[i] |= 1 << (x - 1);
}
}
memset(dp, -1, sizeof dp);
printf("%d\n", dfs(0, 0, 0));
}
return 0;
}
UVA - 10817 Headmaster's Headache (状压dp+记忆化搜索)的更多相关文章
- UVa 10817 Headmaster's Headache (状压DP+记忆化搜索)
题意:一共有s(s ≤ 8)门课程,有m个在职教师,n个求职教师.每个教师有各自的工资要求,还有他能教授的课程,可以是一门或者多门. 要求在职教师不能辞退,问如何录用应聘者,才能使得每门课只少有两个老 ...
- 状压DP+记忆化搜索 UVA 1252 Twenty Questions
题目传送门 /* 题意:给出一系列的01字符串,问最少要问几个问题(列)能把它们区分出来 状态DP+记忆化搜索:dp[s1][s2]表示问题集合为s1.答案对错集合为s2时,还要问几次才能区分出来 若 ...
- [JZOJ5398]:Adore(状压DP+记忆化搜索)
题目描述 小$w$偶然间见到了一个$DAG$. 这个$DAG$有$m$层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有$k$个节点. 现在小$w$每次可以取反第$i(1<i< ...
- loj 1021(状压dp+记忆化搜索)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25887 题目大意:给定的一个某进制下的排列,问它的全排列有多少个能 ...
- loj 1018(状压dp+记忆化搜索)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25844 思路:首先预处理出点在同一直线上的所有的点集状态(dp[i ...
- UVa 10817 (状压DP + 记忆化搜索) Headmaster's Headache
题意: 一共有s(s ≤ 8)门课程,有m个在职教师,n个求职教师. 每个教师有各自的工资要求,还有他能教授的课程,可以是一门或者多门. 要求在职教师不能辞退,问如何录用应聘者,才能使得每门课只少有两 ...
- UVA - 10817 Headmaster's Headache (状压类背包dp+三进制编码)
题目链接 题目大意:有S门课程,N名在职教师和M名求职者,每名在职教师或求职者都有自己能教的课程集合以及工资,要求花费尽量少的钱选择一些人,使得每门课程都有至少两人教.在职教师必须选. 可以把“每个课 ...
- UVa 1252 (状压DP + 记忆化搜索) Twenty Questions
题意: 有n个长为m的各不相同的二进制数(允许存在前导0),别人已经事先想好n个数中的一个数W,你要猜出这个数. 每次只可以询问该数的第K为是否为1. 问采用最优询问策略,则最少需要询问多少次能保证猜 ...
- UVa 1252 Twenty Questions (状压DP+记忆化搜索)
题意:有n件物品,每件物品有m个特征,可以对特征进行询问,询问的结果是得知某个物体是否含有该特征,要把所有的物品区分出来(n个物品的特征都互不相同), 最小需要多少次询问? 析:我们假设心中想的那个物 ...
随机推荐
- js 实现复制功能
//复制注册地址 function copyTuiJianAddress() { try { var name = document.getElementById("share") ...
- treap(堆树)
# 2018-09-27 17:35:58 我实现的这个treap不能算是堆.有问题 最近对堆这种结构有点感兴趣,然后想用指针的方式实现一个堆而不是利用数组这种结构,于是自己想到了一个用二叉树结构实现 ...
- 「CF852D」Exploration Plan
题目描述 给定一张 \(V\) 个点,\(M\) 条边的边带权无向图,有 \(N\) 个人分布在图上的点上,第 \(i\) 个人在 \(x_i\) 这个点上,定义从一个点走到另一个点的时间为所走的路径 ...
- JavaScript图形实例:正多边形
圆心位于坐标原点,半径为R的圆的参数方程为 X=R*COS(θ) Y=R*SIN(θ) 在圆上取N个等分点,将这N个点首尾连接N条边,可以得到一个正N边形. 1.正多边形阵列 构造一个8行8列的正N( ...
- Windows XP 常用DOS命令
winver 检查Windows版本 wmimgmt.msc 打开windows管理体系结构(WMI) wupdmgr windows更新程序 wscript windows脚本宿主设置 writ ...
- 题解 AT1219 【歴史の研究】
莫队 简单分析:题面含有IOI(惊),可知此题是IOI(数字三角形)难度(逃). 思路:回滚莫队 当然很多人都是抱着学回滚莫队的目标来看这道题的,所以这里介绍一下回滚莫队. 1.按莫队的思路讲询问排序 ...
- 守神漏洞扫描器V1.2
主界面 指纹利用 漏洞库 怎么说呢,个人感觉这个扫描器跟小哲的Test404Fuzzer差不多~ 就是功能多了旁站查询.C段查询.而且这款工具的exp比Test404Fuzzer的多了几个~ 总体来说 ...
- 2_04_MSSQL课程_查询_类型转换、表联合、日期函数、字符串函数
类型转换 Convert(目标类型,转换的表达式,格式规范) Cast(表达式 as 类型) select Convert(nvarchar(32)),CustomerId))+Title from ...
- HDU 5525:Product 欧拉定理
Product Accepts: 21 Submissions: 171 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072 ...
- Android 隐藏手机号中间四位和隐藏邮箱地址中间四位
/** * 手机号用****号隐藏中间数字 * * @param phone * @return */public static String settingphone(String phone) { ...