这一题本来是我们比赛练习时遇到的一个问题,记得那场比赛我们对很悲剧,只A了一道水题,也都怪我和一队友卡在了一道几何题上了,一直不肯松手,最后也没做出来,之所以有做这道题,是我学习状态压缩时,为了让自己有个压缩的概念,才做了这道题
由于题目中给的数都比较小不大于14,那就决定了一个集合可以用一个数来表示,如果想到这一步,这问题就好办多了呢
这里用到了位运算的“或”运算,剩余的就是组合集合了,这一题可以获得一些状态压缩的意识,可以作为学习状态压缩的开头曲,呵呵
#include<stdio.h>
#include<string.h>
bool B[1<<14];
int main(){
int n,m,i,set;
int element,count,k;
while(scanf("%d%d",&n,&m)!=EOF){
memset(B,false,sizeof(B));
count=0;
while(n--){
scanf("%d",&k);
set=0;
for(i=0;i<k;i++){
scanf("%d",&element);
element=1<<(element-1);
set=set|element;
}
B[set]=true;
if(i==0)continue;
for(i=1;i<1<<m;i++)
if(B[i])B[i|set]=true;
}
for(i=1;i<=1<<m;i++)if(B[i])count+=1;
printf("%d\n",count);
}
return 0;
}