题目大意:有一些老师,每一位都有自己的工资以及教授的课程。共s<=8个课程。其中的一些老师必须选择,问你保证每节课至少有一个老师的最少总工资。

题解:

首先很容易想到状态压缩,搞一个3进制的数,分别表示每一门课程的情况,一共38=6561。但是这样是不行的,相当于暴力啊!
一个套路:三进制转化为二进制*2。也就是搞一个216的数,1~8和9~16表示每门课程,这样就可以利用位运算了。
然后知道这个就很显然的,一个背包问题。要注意,这样转化为二进制之后,要定义一条规则,每次添加课程,优先1~8位,有了就再加到9~16位即可。
处理出所有强制选择的老师的授课状态S,令dp[S]=sum{c[]}。其他的全是INF。然后从All=(1<<(s*2)-1到S。当成01背包做即可。

 1 #include<queue>
 2 #include<cstdio>
 3 #include<vector>
 4 #include<cstring>
 5 #include<iostream>
 6 #include<algorithm>
 7 #define RG register
 8 #define LL long long
 9 #define fre(a) freopen(a".in","r",stdin);//freopen(a".out","w",stdout);
10 using namespace std;
11 const int MAXN=1000;
12 int s,n,m,S,sum,All;
13 int c[MAXN],a[MAXN],dp[1<<16];
14 char ch;
15 int main()
16 {
17    while(scanf("%d%d%d",&s,&n,&m)!=EOF)
18       {
19          if(s==0)break;
20          All=(1<<(s*2))-1;
21          for(int i=1,flag,x;i<=n+m;i++)//鬼里鬼气的输入
22             {
23                a[i]=0;
24                scanf("%d",&c[i]);
25                flag=0;
26                while(1)
27                   {
28                      ch=getchar();
29                      while(ch<'0'||ch>'9')
30                         {
31                            if(ch=='\n'||ch=='\r') { flag=1; break; }
32                            ch=getchar();
33                         }
34                      if(flag)break;
35                      x=0;
36                      while('0'<=ch&&ch<='9')x=x*10+(ch-'0'),ch=getchar();
37                      a[i]|=(1<<(x-1));
38                      if(ch=='\n'||ch=='\r')break;
39                   }
40             }
41          S=sum=0;
42          for(int i=1;i<=n;i++)//按照规则,优先填后面的
43             {
44                sum+=c[i];
45                int p=S&a[i];
46                S|=(p<<s);
47                S|=a[i];
48             }
49          memset(dp,0x3f3f3f3f,sizeof dp);
50          dp[S]=sum;
51          for(int i=n+1;i<=n+m;i++)
52             {
53                for(int j=All;j>=S;j--)//按照规则,优先填后面的
54                   {
55                      int p=a[i]&j;
56                      p=a[i]|(p<<s);
57                      dp[j|p]=min(dp[j|p],dp[j]+c[i]);
58                   }
59             }
60          printf("%d\n",dp[All]);
61       }
62    return 0;
63 }

转载于:https://www.cnblogs.com/D-O-Time/p/7717803.html

UVA - 10817 Headmaster's Headache相关推荐

  1. 状压DP UVA 10817 Headmaster's Headache

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

  2. uva 10817——Headmaster's Headache

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

  3. Uva 10817 校长的烦恼

    题目链接:https://uva.onlinejudge.org/external/108/10817.pdf 题意:m个教师,n个应聘者,s个课程,每个人的工资为c,每个人能教一些课程.求最少的支付 ...

  4. Headmaster's Headache

    题意: s门课程,现任老师有m个给出工资,和他们能教的课,现在有n个应聘的老师,给出费用和能教的课程标号,求使每门课都至少有两个老师教的最小花费 分析: n个老师选或不选有背包的特征,n很小想到用状压 ...

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

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

  6. 提取了下刘汝佳推荐的题号...

    今天闲来没事上uva oj提取了下刘汝佳推荐的acm题号,原始数据如下: Volume 0. Getting Started    10055 - Hashmat the Brave Warrior ...

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

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

  8. 《算法竞赛入门经典——训练指南》第一章相关内容

    #<算法竞赛入门经典--训练指南>第一章相关内容 希望各位大牛能指导! 红色为已经做了的...黄色背景是还有不懂地方,希望在年前能刷完第一章啊.... 更新版.google上貌似又加了ex ...

  9. UVa Online Judge 工具網站

    UVa Online Judge 工具網站 转自http://www.csie.ntnu.edu.tw/~u91029/uva.html Lucky貓的ACM園地,Lucky貓的 ACM 中譯題目 M ...

最新文章

  1. swing java管理系统_Java swing实现酒店管理系统
  2. [转] JavaScript:彻底理解同步、异步和事件循环(Event Loop)
  3. html动态报警图片,报警记录.html
  4. android uri获取参数,android-无法从深度链接获取Uri数据
  5. 2011年的总结:Fans同学的成败得失
  6. pycharm的演示模式、无干扰模式、全屏模式(presentation mode、distraction free mode、full screen mode)
  7. [lct] Luogu P4219 大融合
  8. thinkphp5.0连接mysql_thinkphp5.0数据库操作
  9. 注意细节:Javascript中的变量作用域
  10. three 实现绕物体旋转,卫星绕星球旋转
  11. 移动终端WAPI证书快速下载并自动连接解决方案
  12. 克隆巴赫系数 Cronbach‘s alpha 及 R, Python 实现
  13. sklearn神经网络/BP神经网络实现葡萄酒分类问题
  14. 计算机应用后期影音制作,影音制作工具(ImTOO Movie Maker)
  15. 怎html样在图片两边加上空白,怎样在博客两边空白处加上自己喜欢的图片?
  16. 关于DMA,TCM和Cache
  17. Java新手入门200例124之用JDBC连接Mysql数据库
  18. 用图灵机器人2.0实现聊天机器人
  19. ‘数据库基础、MariaDB服务部署、库表基本管理、数据类型’经典案例
  20. 文化中国 系列二:纪连海读历史品人物

热门文章

  1. arm-linux-gcc 命令未找到问题
  2. [唐胡璐]VBS技巧 - Find a File Recursively(递归查找文件)
  3. 2012 金华现场赛 A题
  4. 一个项目告一段落,终于可以回家过年了。
  5. socket中的几个数据结构
  6. AndroidStudio_后台服务以及活动和服务间通信_通过service中的binder实现活动和服务的通信---Android原生开发工作笔记216
  7. Python工作笔记002---PYTHON之DEF函数
  8. SpringCloud工作笔记067---消息推送_推送视频_推送图片_在通知栏里显示图片视频_自定义点击消息后的动作
  9. hibernate集合类型映射
  10. 堆内存里的各种奇怪填充值