很简单的题目,将集合压缩成一个数,两重循环搞定。
ACcode:
#include<cstdio>
#include<cstring>
const int NS=15;
int n,m,k,t;
int v[1<<NS],a[111];
int main()
{
while (~scanf("%d%d",&n,&m))
{
for (int i=0;i<n;i++)
{
scanf("%d",&k);
a[i]=0;
for (int j=0;j<k;j++)
scanf("%d",&t),a[i]|=(1<<(t-1));
}
memset(v,0,sizeof(v));
v[0]=1;
int ans=-1,lim=1<<m;
for (int i=0;i<lim;i++)
{
for (int j=0;j<n;j++)
v[i|a[j]]|=v[i];
ans+=v[i];
}
printf("%d\n",ans);
}
return 0;
}
本文介绍了一个简单的算法问题,通过使用集合压缩技术来解决特定类型的组合问题。利用双重循环实现,通过对输入的整数集合进行位操作,实现了有效的状态压缩。
1196

被折叠的 条评论
为什么被折叠?



