【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; }
戒骄戒躁