状压dp一直是弱项啊。。。
#include<stdio.h>
#include<algorithm>
using namespace std;
int n,m,k;
int val[2000];
int f[1000000];
bool check(int x)
{
int cnt=0;
while(x)
{
cnt+=(x&1);
x=x>>1;
}
if(cnt>k)return false;
return true;
}
int main()
{
scanf("%d %d %d",&n,&m,&k);
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
while(x--)
{
int a;
scanf("%d",&a);
val[i]|=(1<<(a-1));
}
}
for(int i=1;i<=n;i++)
{
for(int j=(1<<m)-1;j>=0;j--)//一定要倒序,正序会有一个取好几遍的情况
{
f[j|val[i]]=max(f[j|val[i]],f[j]+1);
}
}
int ans=0;
for(int i=0;i<(1<<m);i++)
{
if(check(i))ans=max(ans,f[i]);
}
printf("%d\n",ans);
}