http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1758

晕。。。。状压没考虑循环方向然后错了好久。。

这点要注意。。。(其实就是01背包变成了完全背包QAQ

我们将课程拆成两个点,然后状压

那么答案就是(1<<(s<<1))-1

转移就不说了,,,,,太简单。。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cmath>
  4. #include <string>
  5. #include <iostream>
  6. #include <algorithm>
  7. #include <queue>
  8. #include <set>
  9. #include <map>
  10. using namespace std;
  11. typedef long long ll;
  12. #define pii pair<int, int>
  13. #define pii pair<int, int>
  14. #define mkpii make_pair<int, int>
  15. #define pdi pair<double, int>
  16. #define mkpdi make_pair<double, int>
  17. #define pli pair<ll, int>
  18. #define mkpli make_pair<ll, int>
  19. #define rep(i, n) for(int i=0; i<(n); ++i)
  20. #define for1(i,a,n) for(int i=(a);i<=(n);++i)
  21. #define for2(i,a,n) for(int i=(a);i<(n);++i)
  22. #define for3(i,a,n) for(int i=(a);i>=(n);--i)
  23. #define for4(i,a,n) for(int i=(a);i>(n);--i)
  24. #define CC(i,a) memset(i,a,sizeof(i))
  25. #define read(a) a=getint()
  26. #define print(a) printf("%d", a)
  27. #define dbg(x) cout << (#x) << " = " << (x) << endl
  28. #define error(x) (!(x)?puts("error"):0)
  29. #define printarr2(a, b, c) for1(_, 1, b) { for1(__, 1, c) cout << a[_][__]; cout << endl; }
  30. #define printarr1(a, b) for1(_, 1, b) cout << a[_] << '\t'; cout << endl
  31. inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
  32. inline const int max(const int &a, const int &b) { return a>b?a:b; }
  33. inline const int min(const int &a, const int &b) { return a<b?a:b; }
  34.  
  35. const int N=17, oo=0x3f3f3f3f;
  36. int f[1<<N], n, m, s, sum[N];
  37. struct dat { int c, s; }a[105], b[105];
  38.  
  39. void readin(dat arr[], int n) {
  40. for1(i, 1, n) {
  41. arr[i].s=0; arr[i].c=oo;
  42. read(arr[i].c); //dbg(arr[i].c);
  43. char ch=getchar();
  44. int r=0;
  45. while(ch!='\n' && ch!='\r') {
  46. if(ch<'0'||ch>'9') {
  47. if(r!=0) arr[i].s|=(3<<((r-1)<<1));
  48. r=0;
  49. while(ch<'0'||ch>'9') {
  50. ch=getchar();
  51. if(ch=='\n' || ch=='\r') break;
  52. }
  53. if(ch=='\n' || ch=='\r') break;
  54. }
  55. r=r*10+ch-'0';
  56. ch=getchar();
  57. }
  58. if(r!=0) arr[i].s|=(3<<((r-1)<<1));
  59. //rep(k, s) if(arr[i].s&(3<<(k<<1))) printf("%d ", k+1);
  60. //puts("");
  61. }
  62. }
  63. void Prin(int x) {
  64. for3(k, ((s-1)<<1)+1, 0) { printf("%d", (bool)(x&(1<<k))); if((k&1)==0) printf(" "); }
  65. puts("");
  66. }
  67. int main() {
  68. read(s); read(n); read(m);
  69. while(s) {
  70. int all=(1<<(s<<1))-1;
  71. CC(f, 0x3f); CC(sum, 0);
  72. readin(a, n); readin(b, m);
  73.  
  74. int tc=0, tn=0;
  75. for1(i, 1, n) rep(k, s) if((a[i].s>>(k<<1))&3) sum[k]++;
  76. rep(k, s) if(sum[k]) {
  77. int t=1;
  78. if(sum[k]>=2) t=3;
  79. tc|=(t<<(k<<1));
  80. }
  81. for1(i, 1, n) tn+=a[i].c;
  82. f[tc]=tn;
  83.  
  84. for1(i, 1, m) {
  85. //dbg(i);
  86. for3(j, all, 0) if(f[j]!=oo) {
  87. int nx=0; //Prin(j);
  88. rep(k, s) if(b[i].s&(3<<(k<<1))) {
  89. int now=(j>>(k<<1))&3;
  90. if(now==0 || now==2) nx|=1<<(k<<1);
  91. if(now==1 || now==3) nx|=2<<(k<<1);
  92. }
  93. f[j|nx]=min(f[j|nx], f[j]+b[i].c); //Prin(nx); Prin(j|nx); puts("");
  94. } }
  95. if(f[all]==oo) f[all]=-1;
  96. printf("%d\n", f[all]);
  97. read(s); read(n); read(m);
  98. }
  99. return 0;
  100. }

  

【UVa】Headmaster's Headache(状压dp)的更多相关文章

  1. UVa 10817 Headmaster's Headache (状压DP+记忆化搜索)

    题意:一共有s(s ≤ 8)门课程,有m个在职教师,n个求职教师.每个教师有各自的工资要求,还有他能教授的课程,可以是一门或者多门. 要求在职教师不能辞退,问如何录用应聘者,才能使得每门课只少有两个老 ...

  2. UVa 1204 Fun Game (状压DP)

    题意:有一些小孩(至少两个)围成一圈,有 n 轮游戏,每一轮从某个小孩开始往左或者往右伟手帕,拿到手帕写上自己的性别(B,G),然后以后相同方向给下一个. 然后在某个小孩结束,给出 n 轮手帕上的序列 ...

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

    题意:给定 n 个计算机的一个关系图,你可以停止每台计算机的一项服务,并且和该计算机相邻的计算机也会终止,问你最多能终止多少服务. 析:这个题意思就是说把 n 台计算机尽可能多的分成一些组,使得每组的 ...

  4. UVA - 10817 Headmaster's Headache (状压类背包dp+三进制编码)

    题目链接 题目大意:有S门课程,N名在职教师和M名求职者,每名在职教师或求职者都有自己能教的课程集合以及工资,要求花费尽量少的钱选择一些人,使得每门课程都有至少两人教.在职教师必须选. 可以把“每个课 ...

  5. UVa 1252 Twenty Questions (状压DP+记忆化搜索)

    题意:有n件物品,每件物品有m个特征,可以对特征进行询问,询问的结果是得知某个物体是否含有该特征,要把所有的物品区分出来(n个物品的特征都互不相同), 最小需要多少次询问? 析:我们假设心中想的那个物 ...

  6. UVA - 1252 Twenty Questions (状压dp+vis数组加速)

    有n个物品,每个物品有m个特征.随机选择一个物品让你去猜,你每次可以询问一个特征的答案,问在采取最优策略时,最坏情况下需要猜的次数是多少. 设siz[S]为满足特征性质集合S的特征的物品总数,dp[S ...

  7. UVA 11825 Hackers’ Crackdown 状压DP枚举子集势

    Hackers’ Crackdown Miracle Corporations has a number of system services running in a distributed com ...

  8. 状压DP UVA 10817 Headmaster's Headache

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

  9. UVA 1412 Fund Management (预处理+状压dp)

    状压dp,每个状态可以表示为一个n元组,且上限为8,可以用一个九进制来表示状态.但是这样做用数组开不下,用map离散会T. 而实际上很多九进制数很多都是用不上的.因此类似uva 1601 Mornin ...

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

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

随机推荐

  1. Android画布更新过程OnDraw调用过程

    onDraw是触发的外置接口,用户能够复写这种方法,这样当回调onDraw时,就能够绘制出用户须要的画面 这个接口方法相似onLayout的回调,利用layout(l,t,r,b)就能够触发. 而这里 ...

  2. openerp在ubuntu中查看日志

    sudo su - openerp -s /bin/bash less /var/log/openerp/openerp-server.log

  3. 利用SQL语句重置数据库中所有表的标识列(自增量)

    可以应用于2种场景: 1.清空所有表中的数据,数据清空后,最好是能够让表中的标识列从1开始记数,所以要重置标识列的当前值. 2.用复制的方式,发布订阅同步数据之后,订阅端的数据不会自动增长,比如自增I ...

  4. iOS pickerView(所有类型一网打尽)

    概述 关于PickView的所有类型都在这里 详细 代码下载:http://www.demodashi.com/demo/11017.html 首先看下项目的整体结构: 一.准备工作 UIPicker ...

  5. 这些小工具让你的Android 开发更高效

    在做Android 开发过程中,会遇到一些小的问题.尽管自己动手也能解决.可是有了一些小工具,解决这些问题就得心应手了,今天就为大家推荐一下Android 开发遇到的小工具,来让你的开发更高效. Vy ...

  6. iOS_数据库2_基础知识

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  7. SpringMVC与SiteMesh

    SpringMVC与SiteMesh2.4无缝整合并借助JSR303规范实现表单验证 SiteMesh3.0的下载,简介与使用 总结: springmvc结合sitemesh总共分三步: 1.添加si ...

  8. Android 四大组件(Activity、Service、BroadCastReceiver、ContentProvider)

    转载于:http://blog.csdn.net/byxdaz/article/details/9708491 http://blog.csdn.net/q876266464/article/deta ...

  9. 【android开发】使用PopupWindow实现页面点击顶部弹出下拉菜单

    没有太多花样,也没有很复杂的技术,就是简单的PopupWindow的使用,可以实现点击弹出一个自定义的view,view里可以随便设计,常用的可以放一个listview. demo中我只是一个点击展示 ...

  10. Android:EditText限制文字输入

    Android的编辑框控件EditText在平常编程时会经常用到,有时候会对编辑框增加某些限制,如限制只能输入数字,最大输入的文字个数,不能输入 一些非法字符等,这些需求有些可以使用android控件 ...