UVA10817 Headmaster's Headache (状压DP)

题目网址:https://vjudge.net/problem/UVA-10817

题意:

S门课程,M个教师,N个待聘教师。每个教师都有工资数和能够教授课程种类,要求在M个教师全部选择的基础上,再选择性的雇佣一部分待聘教师,在保证S门课程都至少有2人教授的前提下,付出的工资最少。s<8

思路:

 我们通过课程信息来确定最终结果,用三个状态s0,s1,s2的二进制位来代表课程当前的状态,s0中的对应二进制位为1表示该课程没有人教授,s1为1表示该课程只有一个人教授,s2为1表示该课程至少两个人教授。

我们通过枚举每位待聘教师来确定最终的答案,很明显转移方程为 dpi   =   min(dp(i+1,news1,news2)+val[ i ] ,dp( i+1, s1,s2) )

即雇佣或者不雇佣该教师的最小值。

因为三个二进制状态的关系,所以我们只需要保留s1和s2就可以很轻易的算出s0 。s0= (s1|s2) ^(全为1);

接下来记忆化搜索一下就行。 

代码如下:

 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;
const int maxn = 150;
const int maxs = (1<<8)+5;
const int inf = 0x3f3f3f3f;
int dp[maxn][maxs][maxs];
int S,M,N;
int val[maxn];
int s[maxn];
int all;
int DP(int t,int s1,int s2)
{
    if(s2==all)
        return 0;
    if(t==N)
    {
        if(s2==all)
            return 0;
        return inf;
    }
    int s0 = ((s1|s2)^all);
    int& res = dp[t][s1][s2];
    if(res!=-1)
        return res;
    int nows = s[t];
    int news1=s1,news2=s2;
    for(int x=0; x

看了看紫书的思路,一遍过还是很开心的。

你可能感兴趣的:(动态规划,UVA)