UVA 10817(状态压缩)

学校要安排s个课程的教师,每个课程至少有两门老师任课,已知学校现有现有的n位老师的工资和任课情况,和m为前来应聘的老师的薪资和任课情况,求出安排全部课程的最少薪资花费。不得开除现有老师。

#include
#include
#include
#include
using namespace std;

const int maxn = 100 + 20 + 5;
const int maxs = 8;
const int INF = 1000000000;
int m, n, s, c[maxn], st[maxn], d[maxn][1<= 0) return ans;

    ans = INF;
    if(i >= m) ans = dp(i+1, s0, s1, s2); // 只有>=m才有不选的资格

    // 选 
    int m0 = st[i] & s0, m1 = st[i] & s1;
    s0 ^= m0;//m0 表示这个人能教的课程 m1表示这个科目前面已经恰好有一个人教了  所以变成有俩个人教了
    s1 = (s1 ^ m1) | m0;// 处理好s0 s1 s2
    s2 |= m1;
    ans = min(ans, c[i] + dp(i+1, s0, s1, s2));
    return ans;
}

int main()
{
    int x;
    string line;
    while(getline(cin, line))
    {
        stringstream ss(line);
        ss >> s >> m >> n;
        if(s == 0) break;

        for(int i = 0; i < m+n; i++)
        {
            getline(cin, line);
            stringstream ss(line);
            ss >> c[i];
            st[i] = 0;
            while(ss >> x) st[i] |= (1 << (x-1));//预处理每个人的教书集合
        }
        memset(d, -1, sizeof(d));
        cout << dp(0, (1<


你可能感兴趣的:(ACM,uva,状态压缩)