描述
小珂有一个奶牛场,奶牛场最近在流行D(1<D<=15)种病毒,小珂的农场一共有N(1<N<=1000)只奶牛,含超过K(1<=K<=D)种病毒的牛奶不得不丢弃.(牛奶中含有奶牛身上的病毒)。现在希望你写一个程序,来确定一下一个桶里的最多可以包含多少头奶牛的牛奶。
输入
第一行一个整数M(1<M<=7),表示有M组测试数据,接下来的M组数据的第一行有三个整数,N,D,K,分别表示奶牛的数量,病毒的总种类,最多一个桶中可以包含的病毒数量。接下来N行,第i行,第一个数 i1,表示第i头牛包含的病毒种类个数,随后i1个数,表示的是病毒种类的标号(默认对D个病毒尽心标号,从1到D ),如果i1 为0,表示第没有病毒。
输出
每组数据输出可以最多挤多少头牛(不换桶),换行结束。
样例输入
1
6 3 2
0
1 1
1 2
1 3
2 2 1
2 2 1
样例输出
小珂有一个奶牛场,奶牛场最近在流行D(1<D<=15)种病毒,小珂的农场一共有N(1<N<=1000)只奶牛,含超过K(1<=K<=D)种病毒的牛奶不得不丢弃.(牛奶中含有奶牛身上的病毒)。现在希望你写一个程序,来确定一下一个桶里的最多可以包含多少头奶牛的牛奶。
输入
第一行一个整数M(1<M<=7),表示有M组测试数据,接下来的M组数据的第一行有三个整数,N,D,K,分别表示奶牛的数量,病毒的总种类,最多一个桶中可以包含的病毒数量。接下来N行,第i行,第一个数 i1,表示第i头牛包含的病毒种类个数,随后i1个数,表示的是病毒种类的标号(默认对D个病毒尽心标号,从1到D ),如果i1 为0,表示第没有病毒。
输出
每组数据输出可以最多挤多少头牛(不换桶),换行结束。
样例输入
1
6 3 2
0
1 1
1 2
1 3
2 2 1
2 2 1
样例输出
5
#include<stdio.h>
#include<string.h>
int virus[16],cow[1010],n,d,k,Max;
void dfs(int step,int sum,int shell)
{//step第几种病毒 sum是当前病毒总数 shell已经选定的病毒
if(d-step+1<k-sum) return;
if(sum==k)
{ int i,ans=0;
for(i=1;i<=n;i++)
if(cow[i]==(cow[i]&shell)) ans++;//看此时i牛的病是否被包含在已有病毒里面
if(ans>Max) Max=ans;
return;
}
dfs(step+1,sum,shell);
dfs(step+1,sum+1,shell|virus[step]);
}
int main()
{ int t,i,j,x,y;
scanf("%d",&t);
for(i=1;i<16;i++)
virus[i]=1<<i;//初始virus数组
while(t--)
{ memset(cow,0,sizeof(cow));
scanf("%d %d %d",&n,&d,&k);
for(i=1;i<=n;i++)
{scanf("%d",&x);
for(j=1;j<=x;j++)
{ scanf("%d",&y);
cow[i]|=virus[y];//加入此病毒
}
}
Max=0;
dfs(1,0,0);
printf("%d\n",Max);
}
return 0;
}