病毒
题目大意:
有n(1<=n<=1000)头奶牛,d(1<=d<=15)种病毒,每头奶牛身上有可能有很多种病毒病毒,每头奶牛挤出的牛奶是混在一起放的,问最多可以挤多少头奶牛的牛奶,而且挤出的奶牛中的病毒种数不大于d(1<=k<=d)
Input
题目中的n,d,k
接下来n行,第一个数d_i表示这头奶牛身上的病毒种数,然后d_i个数表示各个病毒的种类
Output
输出只有一个数,就是可以挤多少头奶牛的牛奶
Sample Input
6 3 2
0
1 1
1 2
1 3
2 2 1
2 2 1
Sample Output
5
Hint
【样例说明】
约翰可以挤编号为1,2,3,5,6的奶牛的牛奶,牛奶中只含两种病毒(#1和#2),病毒种数不大于K(2)。
解题思路:
枚举要不要某种病毒,然后看符合奶牛的有几头即可
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n,d,k,x,y,ans,a[20],b[1005],p[1005][20];
void dfs(int dep,int now)//dep表示第几个病毒,now表示选了几个病毒
{if (now>k) return;//不符合条件if (dep>d)//搜完了{int sum=0;for (int i=1;i<=n;++i)//每头奶牛{sum++;for (int j=1;j<=b[i];++j)//携带的病毒种数if (!a[p[i][j]])//是否包含这个病毒{sum--;//不包含就删掉break;}}ans=max(sum,ans);//取最大值return;}a[dep]=1;//要dfs(dep+1,now+1);a[dep]=0;//不要dfs(dep+1,now);
}
int main()
{scanf("%d %d %d",&n,&d,&k);for (int i=1;i<=n;++i){scanf("%d",&b[i]);for (int j=1;j<=b[i];++j){scanf("%d",&y);p[i][j]=y;//第i头牛的第j个病毒}}dfs(1,0);printf("%d",ans);//输出
}