题目:uva 11825 - Hackers' Crackdown
思路:状态压缩
#include <algorithm>
#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
#define maxn ((1<<16)+1)
int p[20];
int covers[maxn];
int dp[maxn];
int main()
{
int n,m,x;
int cas=0;
while(scanf("%d",&n),n)
{
for(int i=0;i<n;i++)
{
scanf("%d",&m);
p[i]=(1<<i);
while(m--)
{
scanf("%d",&x);
p[i]|=(1<<x);
}
}
for(int i=0;i<(1<<n);i++)
{
covers[i]=0; // 用来表示若干计算机的集合
for(int j=0;j<n;j++)
if(i&(1<<j))
covers[i]|=p[j];
}
memset(dp,0,sizeof(dp));
for(int i=1;i<(1<<n);i++)
{
dp[i]=0;
for(int j=i;j>0;j=(j-1)&i)
if(covers[j]==(1<<n)-1)
dp[i]=max(dp[i],dp[i^j]+1);
}
printf("Case %d: ",++cas);
printf("%d\n",dp[(1<<n)-1]);
}
return 0;
}