题目链接:https://uva.onlinejudge.org/external/108/10817.pdf

题意:m个教师,n个应聘者,s个课程,每个人的工资为c,每个人能教一些课程。求最少的支付费用,

使得,每个课程都有>=2名教师可以上,在职教师不能下岗。

分析:

dp(i,s1,s2)

已经考虑前 i 个人时,此时,课程只有一个人上的集合s1,两个或者以上的课程集合s2的最少费用;

关于课程集合:

首先一个老师的课程m0 = st&s0,就是他能上的没人上的课程集合,st&s1,就是他能上的一个人上的课程的集合,

选了他的话:

s2就是 s2 | m0;

s0就是 s0^m0;

s1 就是 (s1 ^ m1)减少的部分,加上 | m0.

还有,这里的输入很麻烦,没有确定每个人有多少课程。

首先用getline()输入一行,然后stringstream ss(line),用ss>>x不停的输入;

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <string>
 5 #include <iostream>
 6 #include<sstream>
 7
 8 using namespace std;
 9 const int INF = 1000000000;
10 const int maxn = 125;
11
12 int m,n,s;
13 int c[maxn];
14 int st[maxn];
15 int d[maxn][1<<8][1<<8];
16
17
18
19 int dp(int i,int s0,int s1,int s2)
20 {
21     if(i==m+n) return s2 == (1<<s)-1?0:INF;
22
23     int& ans = d[i][s1][s2];
24     if(ans>=0) return ans;
25
26     ans = INF;
27     if(i>=m) ans = dp(i+1,s0,s1,s2);
28
29     int m0 = s0&st[i];
30     int m1 = s1&st[i];
31
32     s0  = s0^m0;
33     s1 = (s1 ^ m1) | m0;
34     s2 = s2 | m1;
35
36     ans = min(ans,c[i]+dp(i+1,s0,s1,s2));
37     return ans;
38
39 }
40
41 int main()
42 {
43     int x;
44     string line;
45     while(getline(cin, line))
46     {
47         stringstream ss(line);
48         ss >> s >> m >> n;
49         if(s == 0) break;
50
51         for(int i = 0; i < m+n; i++)
52         {
53             getline(cin, line);
54             stringstream ss(line);
55             ss >> c[i];
56             st[i] = 0;
57             while(ss >> x) st[i] |= (1 << (x-1));
58         }
59         memset(d, -1, sizeof(d));
60         cout << dp(0, (1<<s)-1, 0, 0) << "\n";
61     }
62     return 0;
63 }

转载于:https://www.cnblogs.com/TreeDream/p/6538231.html

Uva 10817 校长的烦恼相关推荐

  1. UVA 10187 校长的烦恼

    可以用二进制表示子集,这种表示方法真的非常省时间空间,其中从右往左第i位(从0开始编号)表示元素i是否在集合中(1表示"在",0表示"不在") e.g. 二进制 ...

  2. 状压DP UVA 10817 Headmaster's Headache

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

  3. uva 10817——Headmaster's Headache

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

  4. UVA - 10817 Headmaster's Headache

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

  5. UVa在线比赛单题汇总-----DP专题

    动态规划基础 例题 LA 3882 UVa 3882 - And Then There Was One 递推------------无力orz UVa 10635 10635 - Prince and ...

  6. NKOJ C2153「迎新春,贺新年,LJ24祝大家新年快乐」赛后总结帖by TangH

    迎新春,贺新年,LJ24祝大家新年快乐 赛后谢罪反思 LJ24TangHaoLong「唐 浩滝」 Global Igoodvegetablea LJ24新春赛,实则是冬令营状压dp完结小测.OI赛制, ...

  7. 紫书《算法竞赛入门经典》

    紫书<算法竞赛入门经典>题目一览 第3章 数组和字符串(例题) UVA 272 TEX Quotes UVA 10082 WERTYU UVA 401 Palindromes UVA 34 ...

  8. 预警数据一键升级工具_重磅 | 教务管理全新升级,“章鱼校长”助力机构实现轻松管理...

    暑假开班,教务繁忙 今天小云为您送上一个重磅消息 教务管理系统「章鱼校长」全面上线啦!!! 可能会有校长问,为什么叫"章鱼校长"? 当培训机构校长太难了 要会招生.报名.排班.考勤 ...

  9. 云队友丨他是前斯坦福大学校长,谷歌母公司Alphabet现任董事长,他说谦逊是有效领导力的基础

    砺石导语:<砺石读书>是『砺石商业评论』推出的聚焦全球商业经典的读书专栏,本期推荐的书籍是前斯坦福大学校长.谷歌母公司Alphabet现任董事长约翰·汉尼斯的著作<要领>,这本 ...

最新文章

  1. 30分钟搞定数据竞赛刷分夺冠神器LightGBM!
  2. 【Excle数据透视表】如何创建非共享缓存的数据透视表
  3. flock文件锁的学习和应用
  4. C/C++指针与内存管理
  5. 事件冒泡 bubbles cancelBubble stopPropagation() stopImmediatePropagation() 区别
  6. 注解@Component方式代替xml装配bean
  7. spring cloud微服务分布式云架构-config配置自动刷新
  8. android学习1:初识Activity
  9. 解决Element的 InfiniteScroll 无限滚动组件报错
  10. 基于SSM实现的房屋租赁系统【附源码】(毕设)
  11. psp记忆棒测试软件,psp记忆棒修复工具 ms-format
  12. 12306排队是什么意思_12306抢票显示排队中怎么办
  13. 华为p10刷原生android,华为p10怎么刷机 华为p10刷机方法【详细介绍】
  14. 医疗时钟系统的设计方案
  15. java数字转换金额大写——中文金额大写
  16. 华为网络计算机关闭屏幕保护,华为手机的屏幕保护太烦人了怎样才能关闭它
  17. 在线Java 动态运行Java源代码-执行器
  18. Python AutoCAD 注释
  19. 市场调研报告-全球与中国充气帆船市场现状及未来发展趋势
  20. [NOIP1999]Cantor表

热门文章

  1. Windows环境下查看Java进程ID,找到java程序对应的进程pid
  2. springboot 2.0版本自定义ReidsCacheManager的改变
  3. java中 Double和double区别
  4. Citrix小贴纸---连接XenAPP时协议驱动程序错误
  5. (寒假集训)Mooo Moo (完全背包)
  6. ajax上传图片的本质
  7. 第5条:用枚举表示状态、选项、状态码
  8. Disallowed Key Characters(转)
  9. [转载]多维数组与Json格式的转化
  10. 目录服务技术介绍——ADSI(五)