UVA 10817 十一 Headmaster's Headache

Headmaster‘s Headache

Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu

Submit Status Practice UVA 10817

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <algorithm>
  4 using namespace std;
  5 const int inf=1e9+7;
  6 const int mm=65536;
  7
  8 int dp[105][65590];
  9 int appcost[105],appnum[105][30];
 10
 11 int main()
 12 {
 13     int s,n,m,x,y;
 14     int i,j,k;
 15     int sum0,k0;
 16     char a[103];
 17     while(scanf("%d %d %d",&s,&m,&n)!=EOF)
 18     {
 19         if(s==0)
 20             break;
 21         memset(appnum,0,sizeof(appnum));
 22
 23         sum0=0;k0=0;
 24         for(i=1;i<=m;i++)
 25         {
 26             scanf("%d",&x);
 27             sum0=sum0+x;
 28             gets(a);
 29             for(j=0;a[j]!=‘\0‘;j++)
 30             {
 31                 if(‘1‘<=a[j] && a[j]<=‘9‘)
 32                 {
 33                     y=a[j]-‘0‘;y--;
 34                     if(!((k0>>(2*y)) & 1))
 35                     {
 36                         k0=k0 | (1<<(2*y));
 37                     }
 38                     else if(!((k0>>(2*y+1)) & 1))
 39                     {
 40                         k0=k0 | (1<<(2*y+1));
 41                     }
 42                 }
 43             }
 44         }
 45         for(i=1;i<=n;i++)
 46         {
 47             scanf("%d",&appcost[i]);
 48             gets(a);
 49             int num=0;
 50             for(j=0;a[j]!=‘\0‘;j++)
 51             {
 52                 if(‘1‘<=a[j] && a[j]<=‘9‘)
 53                 {
 54                     //y=a[j]-‘0‘;y--;
 55                     num++;
 56                     appnum[i][num]=a[j]-‘0‘;
 57                 }
 58             }
 59             appnum[i][0]=num;
 60         }
 61
 62         int S=1<<(2*s);
 63         for(i=0;i<S;i++)
 64         {
 65             dp[0][i]=inf;
 66         }
 67         dp[0][k0]=sum0;
 68
 69         for(i=1;i<=n;i++)
 70         {
 71             for(j=0;j<S;j++)
 72             {
 73                 dp[i][j]=dp[i-1][j];
 74             }
 75
 76             for(j=0;j<S;j++)
 77             {
 78                 if(dp[i-1][j]<inf)
 79                 {
 80                     k=j;
 81                     for(int l=1;l<=appnum[i][0];l++)
 82                     {
 83                         y=appnum[i][l]-1;
 84                         if(!((k>>(2*y)) & 1))
 85                         {
 86                             k=k | (1<<(2*y));
 87                         }
 88                         else if(!((k>>(2*y+1)) & 1))
 89                         {
 90                             k=k | (1<<(2*y+1));
 91                         }
 92                     }
 93                     dp[i][k]=min(dp[i][k],dp[i-1][j]+appcost[i]);
 94                 }
 95             }
 96         }
 97         printf("%d\n",dp[n][(1<<(2*s))-1]);
 98     }
 99     return 0;
100 }

UVA 10817 十一 Headmaster's Headache

时间: 2024-11-06 03:45:28

UVA 10817 十一 Headmaster's Headache的相关文章

(状压dp)uva 10817 Headmaster&#39;s Headache

题目地址 1 #include <bits/stdc++.h> 2 typedef long long ll; 3 using namespace std; 4 const int MAX=1e5+5; 5 const int INF=1e9; 6 int s,m,n; 7 int cost[125]; 8 //char sta[MAX]; 9 string sta; 10 int able[125]; 11 int dp[125][1<<8][1<<8]; 12 in

UVA 10817 - Headmaster&#39;s Headache

题目:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=20&page=show_problem&problem=1758 状态压缩的DP,dp[i][st]表示状态为st考虑后面i个人所有人最小花费, 因为每个科目有三种状态,可以用一个三进制数表示, 状态不是很多,所以可以把预先把每个数的三进制预处理出来, 决策为选和不选. #include<bits/std

UVA 10817 Headmaster&#39;s Headache 状压DP

记录两个状态S1,S2分别记录哪些课程被1个人教过或2个人教过,然后记忆化搜索 UVA - 10817 Headmaster's Headache Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Problem D: Headmaster's Headache Time limit: 2 seconds The headmaster of Spr

UVA - 10817 Headmaster&#39;s Headache (状压dp+记忆化搜索)

题意:有M个已聘教师,N个候选老师,S个科目,已知每个老师的雇佣费和可教科目,已聘老师必须雇佣,要求每个科目至少两个老师教的情况下,最少的雇佣费用. 分析: 1.为让雇佣费尽可能少,雇佣的老师应教他所能教的所有科目. 2.已聘老师必须选,候选老师可选可不选. 3.dfs(cur, subject1, subject2)---求出在当前已选cur个老师,有一个老师教的科目状态为 subject1,有两个及以上老师教的科目状态为 subject2的情况下,最少的雇佣费用. dp[cur][subje

UVa 10817 (状压DP + 记忆化搜索) Headmaster&#39;s Headache

题意: 一共有s(s ≤ 8)门课程,有m个在职教师,n个求职教师. 每个教师有各自的工资要求,还有他能教授的课程,可以是一门或者多门. 要求在职教师不能辞退,问如何录用应聘者,才能使得每门课只少有两个老师教而且使得总工资最少. 分析: 因为s很小,所以可以用状态压缩. dp(i, s1, s2)表示考虑了前i个人,有一个人教的课程的集合为s1,至少有两个人教的集合为s2. 在递归的过程中,还有个参数s0,表示还没有人教的科目的集合. 其中m0, m1, s0, s1, s2的计算用到位运算,还

Uva 10817 Headmaster&#39;s Headache (DP+ 状态压缩)

Problem D: Headmaster's Headache Time limit: 2 seconds The headmaster of Spring Field School is considering employing some new teachers for certain subjects. There are a number of teachers applying for the posts. Each teacher is able to teach one or

状压DP UVA 10817 Headmaster&#39;s Headache

题目传送门 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用到了& |位运算

UVA - 10817 Headmaster&#39;s Headache (状压类背包dp+三进制编码)

题目链接 题目大意:有S门课程,N名在职教师和M名求职者,每名在职教师或求职者都有自己能教的课程集合以及工资,要求花费尽量少的钱选择一些人,使得每门课程都有至少两人教.在职教师必须选. 可以把“每个课程已经分别有几个人教”作为状态来进行转移,每个人能教的课程集合作为“物品重量”,工资作为“价值”来更新dp值,类似01背包,每放进一个人,从后往前更新即可. 状态的表示可以用三进制编码,为了写起来舒服,我写了个结构体作为状态和编码转换的桥梁,也可以进行状态的“加法运算”,虽然速度比较慢就是了~~ 有

10817 - Headmaster&#39;s Headache(校长的烦恼)

经典的状态压缩DP . 根据DP的阶段定义,我们需要枚举每一个教师进行递推,但是由于每个教师可以教授的课程是复杂多样的,所以使得状态变得难以转移 .那么要怎么样表示状态呢? 显然增加一两个维度是无法胜任的,所以我们可以用二进制枚举子集的方法,用一个整数通过位运算充当一个集合 . C++提供的位运算符极像对集合的操作,我们恰好可以利用这一点 . 用d[i][s1][s2]表示考虑了前i个人时的最小花费 . 其中s1表示恰有一个人教的科目集合,s2表示至少有两个人教的科目集合 .因为由这两个量就可以