Frequent Subsets Problem
题目
样例
好像样例输出有问题,我代码运行为10。
思路
m个子集(S1,S2,S3…Sm)中取一子集Ui,若Ui是Sj的子集的Sj数量>=w*m,则num++。
可用状压存储Sj,再用二进制枚举子集法寻找计数。
代码
#include<iostream>
#include<cmath>
using namespace std;
int a[55];
int main()
{
int n,num=0,sum,k=0,x;
char c;
double m;
cin>>n>>m;
while(scanf("%d%c",&x,&c)!=EOF)
{
a[k]+=(1<<(x-1));
if(c=='\n') k++;
}
int t=ceil(m*k);//向上取整
for(int i=1;i<=(1<<n);i++)//枚举子集
{
sum=0;
for(int j=0;j<k;j++)//过一遍Sj
if((i&a[j])==i) sum++;//是Sj的子串就计数
if(sum>=t) num++;//满足不等式
}
cout<<num<<endl;
return 0;
}