小珂的工作

来源:互联网 发布:人工智能的发展进程 编辑:程序博客网 时间:2024/04/19 08:41
描述
小珂有一个奶牛场,奶牛场最近在流行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;}



0 0