小珂的工作

描述
小珂有一个奶牛场,奶牛场最近在流行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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值