JZ初中OJ 1339. [南海2009初中]disease

题目描述

  近期,农场出现了D (1<= D <=15)种细菌。John 要从他的 N (1<= N <=1,000)头奶牛中尽可能多地选些产奶。但是如果选中的奶牛携带了超过 K (1<= K <=D)种不同细菌,所生产的奶就不合格。请你帮助John 计算出最多可以选择多少头奶牛。
 

输入

第一行:三个整数 N, D, K

下面N行:第行表示一头牛所携带的细菌情况。第一个整数 di 表示这头牛所携带的细菌种类数,后面di个整数表示这些细菌的各自种类标号。

输出

只一个数 M,最大可选奶牛数。
 

样例输入

 

样例输出

 
 

数据范围限制

 
 

提示

样例















输入  

6 3 2         

0

1 1

1 2

1 3

2 2 1

2 2 1

选择:

1,2,3,5,6

只有1#和2#两种细菌

输出

5

    
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,ans,d,k,inf=-0x3f3f3f,flag[16],use[16]; 
 4 bool a[1001][16];
 5 void dfs(int x)
 6 {
 7     for(int i=use[x-1]+1;i<=d;i++)
 8     {
 9         if(flag[i]==0)
10         {
11             flag[i]=1;
12             use[x]=i;
13             if(x==k)
14             {
15                 for(int j=1;j<=n;j++)
16                 {
17                        for(int i=1;i<=d;i++)
18                     {
19                         if(a[j][i]==true&&flag[i]==0)
20                           {
21                         ans--;
22                         break;
23                         }
24                     }
25                 }
26                 if(ans>inf)
27                 inf=ans;
28                 ans=n;
29             }
30             else
31             dfs(x+1);    
32             flag[i]=0;
33             use[x]=0;
34         }
35     }
36 }
37 int main()
38 {
39     cin>>n>>d>>k;
40     ans=n;
41     for(int i=1;i<=n;i++)
42     {
43         scanf("%d",&a[0][0]);
44         for(int j=1;j<=a[0][0];j++)
45         {
46             scanf("%d",&a[0][1]);
47             a[i][a[0][1]]=true;
48         }
49     }
50     dfs(1);
51     cout<<inf;
52     return 0;
53 }
原文地址:https://www.cnblogs.com/dsanying/p/11306734.html