题目传送门

 1 /*
 2     题意:学校有在任的老师和应聘的老师,选择一些应聘老师,使得每门科目至少两个老师教,问最少花费多少
 3     状压DP:一看到数据那么小,肯定是状压了。这个状态不好想,dp[s1][s2]表示s1二进制表示下至少有1位老师的科目集合
 4             s2表示至少有2位老师的科目集合所花费的最小金额,状态转移方程(01):dp[t1][t2]=min(dp[t1][t2],dp[j][k]+c[i]);
 5             j,k为当前两个集合,t1,t2为转移后的集合,另外求t1,t2用到了& |位运算 1&1 == 1 1 & 0 == 0 0 & 0 == 0
 6             最后,学习了不知道数字多少个时应该用字符串整行读入
 7   详细解释 8
 9 */
10 /************************************************
11 * Author        :Running_Time
12 * Created Time  :2015-8-10 14:44:30
13 * File Name     :UVA_10817.cpp
14  ************************************************/
15
16 #include <cstdio>
17 #include <algorithm>
18 #include <iostream>
19 #include <sstream>
20 #include <cstring>
21 #include <cmath>
22 #include <string>
23 #include <vector>
24 #include <queue>
25 #include <deque>
26 #include <stack>
27 #include <list>
28 #include <map>
29 #include <set>
30 #include <bitset>
31 #include <cstdlib>
32 #include <ctime>
33 using namespace std;
34
35 #define lson l, mid, rt << 1
36 #define rson mid + 1, r, rt << 1 | 1
37 typedef long long ll;
38 const int MAXN = 150;
39 const int INF = 0x3f3f3f3f;
40 const int MOD = 1e9 + 7;
41 int c[MAXN], p[MAXN], cnt[10];
42 int dp[(1<<8)+10][(1<<8)+10];
43 int s, m, n;
44 int mxs;
45 int sum, st1, st2;
46
47 int work(void)  {
48     memset (dp, INF, sizeof (dp));
49     dp[st1][st2] = sum;
50     for (int i=m+1; i<=m+n; ++i)    {
51         for (int j=mxs; j>=0; --j) {
52             for (int k=mxs; k>=0; --k) {
53                 if (dp[j][k] == INF)    continue;
54                 int t1 = (p[i] | j);  int t2 = (p[i] & j) | k;
55                 dp[t1][t2] = min (dp[t1][t2], dp[j][k] + c[i]);
56             }
57         }
58     }
59     return dp[mxs][mxs];
60 }
61
62 int main(void)    {     //UVA 10817 Headmaster's Headache
63     while (scanf ("%d%d%d", &s, &m, &n) == 3)   {
64         if (!s) break;
65
66         memset (cnt, 0, sizeof (cnt));
67         memset (p, 0, sizeof (p));
68         sum = 0, st1 = st2 = 0; mxs = (1 << s) - 1;
69         string str;
70         for (int i=1; i<=m+n; ++i)    {
71             scanf ("%d", &c[i]);
72             getline (cin, str);
73             for (int j=0; str[j]; ++j)  {
74                 if (isdigit (str[j]))   {
75                     int x = str[j] - '0';
76                     p[i] |= 1 << (x - 1);
77                     if (i <= m) ++cnt[x-1];
78                 }
79             }
80             if (i <= m) {
81                 sum += c[i];    st1 |= p[i];
82             }
83         }
84         for (int i=0; i<s; ++i) {
85             if (cnt[i] > 1) st2 |= (1 << i);
86         }
87
88         printf ("%d\n", work ());
89     }
90
91     return 0;
92 }

转载于:https://www.cnblogs.com/Running-Time/p/4718419.html

状压DP UVA 10817 Headmaster's Headache相关推荐

  1. uva 10817——Headmaster's Headache

    题意:某个学校有m个老师和n个求职者,需要讲授s个课程,已知每个人的工资c和能交的课程,求花费最小使得每门课程都至少有两个人教. 思路:状压dp,将每个老师要交的课程压缩成一个数,然后对于每门课,找到 ...

  2. UVA - 10817 Headmaster's Headache

    题目大意:有一些老师,每一位都有自己的工资以及教授的课程.共s<=8个课程.其中的一些老师必须选择,问你保证每节课至少有一个老师的最少总工资. 题解: 首先很容易想到状态压缩,搞一个3进制的数, ...

  3. UVA-10817- Headmaster's Headache(状压DP)

    UVA-10817- Headmaster's Headache 题意: 这间学校开设S门课,给出校长已经有的师资n,然后再给出m个应聘者,每门课至少有两名任课老师,求最少需要的雇佣工资. 分析: 这 ...

  4. UVa 11825 (状压DP) Hackers' Crackdown

    这是我做状压DP的第一道题,状压里面都是用位运算来完成的,只要耐下心来弄明白每次位运算的含义,还是容易理解的. 题意: 有编号为0~n-1的n台服务器,每台都运行着n中服务,每台服务器还和若干台其他服 ...

  5. 状压DP学习总结 (详解,适合没状压dp基础的人学习,还在更新中,,,,)

    本次博客,主要是给学弟学妹们讲解一下状压dp,不适合有基础的同学观看,可能会浪费时间,因为偏基础 先来最简单的一个吧   http://acm.hdu.edu.cn/showproblem.php?p ...

  6. POJ 1038 Bugs Integrated Inc (复杂的状压DP)

    \(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...

  7. codeforces 8C. Looking for Order 状压dp

    题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...

  8. UVA10296 Jogging Trails(中国邮递员问题)(欧拉回路、一般图最大权匹配 / 状压DP)

    整理的算法模板合集: ACM模板 目录 思路 UVA10296 Jogging Trails 题目翻译: 给你n个点,m条无向边,每条边有一定的距离数值,构造成一个连通图.问从任意一点出发,遍历所有的 ...

  9. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

最新文章

  1. 【BFS】【并查集】【Tarjan】【LCA】Gym - 101173H - Hangar Hurdles
  2. 云炬随笔20171227
  3. 重温c语言之环境变量
  4. docker zookeeper kafka kafka-manager 本地hbase hadoop
  5. 台式计算机机箱都一样吗,别以为组装台式机很简单,机箱选择大有学问
  6. 如何优雅地测量一只猫的体积?
  7. Keil系列教程(汇总)
  8. 保险中介3.0时代:数字化中介在场景中打造核心竞争力
  9. DTcms-【需求】-需求分析
  10. 微信小程序前端服务外包
  11. 2020计算机考试内容,2020年全国计算机二级OFFICE考试内容
  12. 用docker在linux上安装qq和微信
  13. 如何利用电脑榨干闲置的带宽资源?
  14. 来自灵魂的拷问——知道什么是SQL执行计划吗?
  15. javaMail 发送邮件 标题过长出现乱码
  16. maven源码阅读之二(plexus-classworlds)
  17. 使用vue xlsx插件实现指定行数导入excel
  18. AAA企业信用等级证书
  19. cesium three性能比较_基督教/天主教/东正教/犹太教圣经简单比较
  20. java 添加附件_java发送邮件(一)--补充添加附件

热门文章

  1. 引入js_好程序员web前端教程分享js中的模块化一
  2. 7-5 表达式转换 (18 分)
  3. 三角形数、五边形数和六角形数
  4. 六元均匀直线阵的各元间距为_小间距led显示屏的封装方式有哪些?本文带你了解!...
  5. python删除链表中重复的节点_删除链表中所有值与Python相同的节点的程序
  6. 关于idea Tomcat部署的一个小坑
  7. 前端工程师面试问题归纳(三、代码类)
  8. 13章 购买服务器和域名绑定
  9. 查询屏幕中一个已知颜色的值
  10. 华为S5024p交换机配端口镜像