uva - 11825(高效枚举集合dp)

来源:互联网 发布:最全专业网络投资理财 编辑:程序博客网 时间:2024/06/17 13:09
#include <cstdio>#include <iostream>#include <cstring>using namespace std;const int maxn = 16;int n,d[1<<maxn],cover[1<<maxn],ALL,a[maxn*2];int main(){  int kase=1;  while(scanf("%d",&n)==1&&n){     int ALL = (1<<n) - 1;     for(int i=0;i<n;i++){         int m,x; a[i]=(1<<i);         scanf("%d",&m);         for(int j=1;j<=m;j++){            scanf("%d",&x);            a[i]|=(1<<(x));         }     }     for(int i=1;i<=ALL;i++){          cover[i]=0;          for(int j=0;j<n;j++) if(((i>>j)&1)){            cover[i]|=a[j];          }     }     for(int i=1;i<=ALL;i++){        d[i]=0;        for(int s=i;s;s=(s-1)&i) if(cover[s]==ALL)            d[i]=max(d[i],d[i^s]+1);     }     printf("Case %d: %d\n",kase++,d[ALL]);  }  return 0;}

0 0