给出一些集合,求组合出来的新的集合最多有多少个(包括原来的)。
状压dfs即可。
#include<set>
#include<stdio.h>
#include<cstring>
using namespace std;
set<int> s;
int n, m, k;
int a[150];
int ans;
void dfs( int id, int now )
{
if( s.find(now) == s.end() )
{
ans++;
s.insert(now);
}
for ( int i = id+1; i <= n; i++ )
{
if(s.find(now|a[i]) == s.end())
dfs( i, now | a[i]);
}
}
int main()
{
while(~scanf("%d%d", &n, &m))
{
s.clear();
memset(a, 0, sizeof(a));
int x;
for( int i = 1; i <= n; i++ )
{
scanf("%d", &k);
while(k--)
{
scanf("%d", &x);
a[i] = a[i] | (1 << x);
}
}
ans = 0;
for( int i = 1; i <= n; i++ )
{
int now = a[i];
dfs(i, now);
}
printf("%d\n", ans);
}
return 0;
}