题目描述 传送门
简单的状态压缩DP。
代码
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=18;
int d[1<<maxn],p[maxn],S1[1<<maxn];
int main(){
int n,kase=0;
while(scanf("%d",&n)==1&&n){
int U=(1<<n)-1;
memset(p,0,sizeof(p));
for(int i=0;i<n;i++){
int m;
scanf("%d",&m);
for(int j=0;j<m;j++){
int a;
scanf("%d",&a);
p[i]|=1<<a;
}
p[i]|=1<<i;
}
S1[0]=0;
for(int s=1;s<=U;s++)
for(int j=15;j>=0;j--) if((1<<j)&s)
S1[s]=p[j]|S1[s^(1<<j)];
for(int s=1;s<=U;s++){
d[s]=0;
for(int s1=s;s1;s1=(s1-1)&s)
if(S1[s1]==U) d[s]=max(d[s],d[s^s1]+1);
}
printf("Case %d: %d\n",++kase,d[U]);
}
return 0;
}