【UVA11825】

cover[s]表示S这个状态下,他能包含多少台电脑。

转移f[S]=max(f[S],f[S^S0]+1)s0能包含全部元素。

#include<bits/stdc++.h>
using namespace std;
const int m=2e5;
int cover[m],f[m],p[m],n,t=0;
int main()
{    cin>>n;
    while(n){
    memset(cover,0,sizeof(cover));
    memset(f,0,sizeof(f));
    t++;
    for(int i=0;i<n;i++){
    p[i]=1<<i;
    int a,b;
    cin>>a;
    for(int j=1;j<=a;j++){
    cin>>b;p[i]=p[i]|(1<<b);}
    }
    for(int s=0;s<(1<<n);s++)
       for(int i=0;i<n;i++)
        if(s&(1<<i))cover[s]=cover[s]|p[i];
    int all=(1<<n)-1;
    for(int i=1;i<(1<<n);i++)
     for(int s=i;s;s=(s-1)&i)
     if(cover[s]==all)f[i]=max(f[i],f[s^i]+1);
     cout<<"Case "<<t<<": "<<f[(1<<n)-1]<<endl;
     cin>>n;
    }
    
    return 0;
}
View Code

 

posted @ 2018-09-18 18:22  周栎  阅读(214)  评论(0编辑  收藏  举报