UVA - 10817 Headmaster's Headache (状压类背包dp+三进制编码)
题目大意:有S门课程,N名在职教师和M名求职者,每名在职教师或求职者都有自己能教的课程集合以及工资,要求花费尽量少的钱选择一些人,使得每门课程都有至少两人教。在职教师必须选。
可以把“每个课程已经分别有几个人教”作为状态来进行转移,每个人能教的课程集合作为“物品重量”,工资作为“价值”来更新dp值,类似01背包,每放进一个人,从后往前更新即可。
状态的表示可以用三进制编码,为了写起来舒服,我写了个结构体作为状态和编码转换的桥梁,也可以进行状态的“加法运算”,虽然速度比较慢就是了~~
有点想吐槽的是,出题人就不能把每个人能教的课程数量也放在输入里么?非逼得人家用getline嘛~~
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=+,inf=0x3f3f3f3f;
int k,n,m,d[(<<(N*))+],co,mx;
string line;
struct D {
int a[N];
int& operator[](int x) {return a[x];}
D(int x=) {
memset(a,,sizeof a);
for(int i=; i<k; ++i,x/=)a[i]=x%;
}
D operator+(D& b) {
D ret;
for(int i=; i<k; ++i)ret[i]=min(a[i]+b[i],);
return ret;
}
operator int() {
int ret=;
for(int i=k-; i>=; --i)ret=ret*+a[i];
return ret;
} }; int main() {
ios::sync_with_stdio();
while(cin>>k>>n>>m&&k) {
cin.ignore();
memset(d,inf,sizeof d);
d[]=;
co=,mx=pow(,k)+0.5;
while(n--) {
getline(cin,line);
stringstream ss(line);
int x;
ss>>x;
co+=x;
D t;
while(ss>>x)t[x-]=;
for(int i=mx-; i>=; --i)if(!d[i])d[D(i)+t]=;
}
for(int i=; i<mx; ++i)if(!d[i])d[i]=co;
while(m--) {
getline(cin,line);
stringstream ss(line);
ss>>co;
int x;
D t;
while(ss>>x)t[x-]=;
for(int i=mx-; i>=; --i) {
d[D(i)+t]=min(d[D(i)+t],d[i]+co);
}
}
printf("%d\n",d[mx-]);
}
return ;
}
UVA - 10817 Headmaster's Headache (状压类背包dp+三进制编码)的更多相关文章
- UVa 10817 Headmaster's Headache (状压DP+记忆化搜索)
题意:一共有s(s ≤ 8)门课程,有m个在职教师,n个求职教师.每个教师有各自的工资要求,还有他能教授的课程,可以是一门或者多门. 要求在职教师不能辞退,问如何录用应聘者,才能使得每门课只少有两个老 ...
- 状压DP UVA 10817 Headmaster's Headache
题目传送门 /* 题意:学校有在任的老师和应聘的老师,选择一些应聘老师,使得每门科目至少两个老师教,问最少花费多少 状压DP:一看到数据那么小,肯定是状压了.这个状态不好想,dp[s1][s2]表示s ...
- UVA 10817 - Headmaster's Headache(三进制状压dp)
题目:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=20&pag ...
- UVA 10817 Headmaster's Headache(DP +状态压缩)
Headmaster's Headache he headmaster of Spring Field School is considering employing some new teacher ...
- UVa 10817 - Headmaster's Headache(状压DP)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA - 10817 Headmaster's Headache (状压dp+记忆化搜索)
题意:有M个已聘教师,N个候选老师,S个科目,已知每个老师的雇佣费和可教科目,已聘老师必须雇佣,要求每个科目至少两个老师教的情况下,最少的雇佣费用. 分析: 1.为让雇佣费尽可能少,雇佣的老师应教他所 ...
- uva 10817 - Headmaster's Headache ( 状态压缩dp)
本文出自 http://blog.csdn.net/shuangde800 题目链接: 点击打开链接 题目大意 某校有n个教师和m个求职者,已知每人的工资和能教的课程集合,要求支付最少的工资使得每 ...
- UVA - 10817 Headmaster's Headache
题目大意:有一些老师,每一位都有自己的工资以及教授的课程.共s<=8个课程.其中的一些老师必须选择,问你保证每节课至少有一个老师的最少总工资. 题解: 首先很容易想到状态压缩,搞一个3进制的数, ...
- Travelling(HDU3001+状压dp+三进制+最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题目: 题意:n个城市,m条边,每条边都有一个权值,问你经过所有的城市且每条边通过次数不超过两次 ...
随机推荐
- focus + select
focus使光标定位到目标节点之后 select选中光标所在位置的全部内容
- win32调试——OutputDebugString
win32下开发console程序可以直接用printf打印到控制台. 开发图形界面程序时,可以调用OutputDebugString将字符串输出到Debug窗口, 注意是要调试运行才能看到Debug ...
- Github结合Eclipse出现的问题
半年前因为学习Git花费了很长时间,半年过去了,因为不使用,基本全部忘记了,最近在公司需要使用Eclipse开发相关项目,用到前期的测试数据挖掘的小算法,又重拾Git,不过这次不再是命令行模式,而是结 ...
- HashTable的使用,扑克牌发牌游戏
l 场景 主要实现以下功能: 1. 首先给扑克牌中每张牌设定一个编号,下面算法实现的编号规则如下: 红桃按照从小到大依次为:1-13 方块按照从小到大依次为:14-26 黑桃按 ...
- Linux用户和用户组管理 用户管理相关命令
用户添加命令 useradd 注意: 新添加的用户如果不设定密码是不能够登录系统的 命令格式: [root@localhost ~]#useradd [选项] 用户名 选项说明: 选项 选项说明 -u ...
- Java 集合系列13之 TreeMap详细介绍(源码解析)和使用示例
转载 http://www.cnblogs.com/skywang12345/p/3310928.html https://www.jianshu.com/p/454208905619
- hadoop程序在本地模式调试作业
1.首先下载cygwin,例如安装在该目录下,D:\Program Files\cygwin\ 2.copy linux上的jar包到D:\Program Files\cygwin\home\lib ...
- Go sync模块
// A WaitGroup waits for a collection of goroutines to finish.// The main goroutine calls Add to set ...
- mysql删除重复记录
Solution 1: Add Unique Index on your table: ALTER IGNORE TABLE `TableA` ADD UNIQUE INDEX (`member_id ...
- EasyUI学习
1.基础知识: 1)Parser解析器: div指定了class后能有效果是因为开始时文档时加载DOM但是一些由js动态生成的指定了class的div没有被解析此时就需要手动解析了 js动态生成的指定 ...