题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=167
分析:
题目的意思就是让求k种病毒所包含的最多的奶牛的个数。找包含关系的最大数目;包含关系我们可以用位运算里的按位或(|)运算符。如果a包含b则,a=a|b, b=a&b;用的这个思想之后就直接按病毒的个数深搜, 求当病毒的个数为k个时再找共有多少头奶牛,就可以了。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int N = 1005;
const int M = 20;
int cow[N];
int dig[M];
int n, m, k, ans;
void inin()
{
//一个二进制位代表一个病毒,方便运算
for(int i = 0; i <= 15; i++)
dig[i] = 1<<i;
}
void dfs(int i, int num, int sum)
{
//i 为第i个病毒,num 选中的病毒的数量,sum以选定的病毒
if(m-i+1 < k-num)//剪枝
return ;
if(num == k)
{
int tt = 0;
for(int j = 0; j < n; j++)
if(cow[j] == (cow[j]&sum))
tt++;
ans = max(ans, tt);
return ;
}
dfs(i+1, num, sum);
dfs(i+1, num+1, sum|=dig[i]);
}
int main()
{
int T, x, t;
inin();
scanf("%d", &T);
while(T--)
{
scanf("%d%d%d", &n, &m, &k);
memset(cow, 0, sizeof(cow));
for(int i = 0; i < n; i++)
{
scanf("%d", &t);
while(t--)
{
scanf("%d", &x);
cow[i] |= dig[x];
}
}
ans = 0;
dfs(1, 0, 0);
printf("%d\n", ans);
}
return 0;
}