题解:傻逼题
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#define inf (INT_MIN/2)
#define N 1010
#define D 16
using namespace std;
inline int getv(int x,int p)
{
return (x&(1<<(p-1)))>>(p-1);
}
inline int updv(int x,int p)
{
return x|(1<<(p-1));
}
inline int delv(int x,int p)
{
return x^(1<<(p-1));
}
inline int output(int x,int n)
{
for(int i=1;i<=n;i++)
cout<<getv(x,i);
return 0;
}
inline int gcnt(int x,int n)
{
int cnt=0;
for(int i=1;i<=n;i++)
if(getv(x,i)) cnt++;
return cnt;
}
int a[N],dp[2][1<<D],cnt[1<<D];
int main()
{
int n,d,k;scanf("%d%d%d",&n,&d,&k);
for(int i=1;i<=n;i++)
{
int p;scanf("%d",&p);
while(p--)
{
int x;scanf("%d",&x);
a[i]=updv(a[i],x);
}
}
int all=(1<<d)-1;
for(int i=0;i<=all;i++)
cnt[i]=gcnt(i,d);
int now=0,nxt=1;
for(int i=0;i<n;i++,swap(nxt,now))
for(int j=0;j<=all;j++)
{
if(cnt[j]<=k) dp[nxt][j]=max(dp[nxt][j],dp[now][j]);
if(cnt[j|a[i+1]]<=k)
dp[nxt][j|a[i+1]]=max(dp[nxt][j|a[i+1]],dp[now][j]+1);
}
int ans=0;swap(now,nxt);
for(int i=0;i<=all;i++)
if(cnt[i]<=k) ans=max(ans,dp[nxt][i]);
printf("%d\n",ans);return 0;
}