https://vjudge.net/problem/UVA-10817

题意:

某校有m个教师和n个求职者,需讲授s个课程,已知每人的工资c和能教的课程集合,要求支付最少的工资使得每门课都至少有两名老师能教。

思路:

s1表示恰好有一个人教的科目集合,s2表示至少有两个人教的科目集合。

d[i][s1][s2]表示已经考虑了前i个人时的最小花费。参考了大神的代码,如下:

 #include<iostream>
#include<string>
#include<cstring>
#include<sstream>
#include<algorithm>
using namespace std; const int maxn = + ;
const int maxs = + ;
#define INF 100000000
int m, n, s;
int c[maxn], st[maxn];//数组c表示工资,st表示第i个老师教课的集合
int d[maxn][ << maxs][ << maxs]; int dp(int i, int s0, int s1, int s2)
{
if (i == m + n)
return s2 == ( << s) - ? : INF;//如果s2恰好等于全部课程的集合时,已经满足题意,不需要花钱
int& ans = d[i][s1][s2];
if (ans >= )return ans;
ans = INF;
if (i >= m) ans = dp(i + , s0, s1, s2);//不选第i个应聘者,由于选i应聘者会导致s0,s1,s2改变,因此先初始化成不选
int m0 = st[i] & s0;//只有第i个应聘者会教的课程
int m1 = st[i] & s1;//第i个应聘者也会教的课程
s0 ^= m0;//在s0集合中除去所有只有i应聘者会教的课程,即m0
s1 = (s1^m1) | m0;//m1代表的所有课程变为了至少两个人会教,从s1中除去,同时加上m0
s2 |= m1;//将m1添加到s2
ans = min(ans, c[i] + dp(i + , s0, s1, s2));//选第i个应聘者,取较小者
return ans;
} int main()
{
//freopen("D:\\txt.txt", "r", stdin);
while (~scanf("%d%d%d", &s, &m, &n) && s&&m&&n)
{
memset(d, -, sizeof(d));
memset(st, , sizeof(st));
getchar();
for (int i = ; i < m + n; i++)
{
string str;
getline(cin, str);
stringstream ss(str);
int x, flag = ;
while (ss >> x)
{
if (flag){ flag = ; c[i] = x; }
else
{
x--; //将科目从0开始编号
st[i] |= ( << x); //二进制的压缩存储
}
}
}
int ans = dp(, ( << s) - , , );
printf("%d\n", ans);
}
return ;
}

最新文章

  1. [Java][Weblogic] weblogic.net.http.SOAPHttpsURLConnection incompatible with javax.net.ssl.HttpsURLConnection解决办法
  2. 等号赋值与memcpy的效率问题
  3. java识别简单的验证码
  4. oracle学习 十一 包+复合类型+自定义异常(持续更新)
  5. vs2013编译boost库
  6. Node.js 【使用npm安装一些包失败之笔记】
  7. Android动态加载技术初探
  8. ubuntu14.04 为Firefox安装flash插件
  9. MyEclipse汉化后问题
  10. Machine Learning—Linear Regression
  11. 第三方框架ViewPagerIndicator引入到Android Studio的方法总结
  12. SpringCloud学习之Hystrix
  13. 迄今为止 .Net 平台功能最强大,性能最佳的 JSON 序列化和反序列化库。
  14. composer阿里云短信服务不支持传参为数值--为2017年短信接口,2018阿里云有更新http://www.cnblogs.com/q1104460935/p/8916096.html
  15. 【转】无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) ubuntu 安装vim 及遇到的错误处理
  16. Selenium自动化测试Python三:WebDriver进阶
  17. Spark记录-Scala语句(运算符-if-for-while-try-模式匹配)
  18. jQuery之前端国际化jQuery.i18n.properties[转]
  19. 一、JSON解析与字符串化
  20. Kotlin中常量和静态方法

热门文章

  1. django 中的render和render_to_response()和locals()
  2. INT_MAX和INT_MIN注意事项
  3. [LeetCode] 256. Paint House_Easy tag: Dynamic Programming
  4. 机器学习理论基础学习16---高斯网络(GN)
  5. 关于 WebBrowser调用百度地图API 鼠标滚轮缩放地图级别失灵的解决办法
  6. Python 在序列上跟踪索引和值
  7. 数据仓库原理&lt;4&gt;:联机分析处理(OLAP)
  8. RHEL6.4 字符模式下安装图形界面图文教程
  9. C/C++之面向对象
  10. 又一国产855旗舰突然现身:支持5G