题目描述
近期,农场出现了D(1≤D≤15)种细菌。Farmer John要从他的N(1≤N≤1000)头奶牛中尽可能多地选些产奶。但是如果选中的奶牛携带了超过K(1≤K≤D)种不同细菌,所生产的奶就不合格。请你帮助John计算出最多可以选择多少头奶牛。
输入输出格式
输入格式:
第一行,三个整数,N,D,K;
下面N行,第i行表示一头牛所携带的细菌情况。第一个整数di表示这头牛所携带的细菌种类数,后面di个整数表示这些细菌的各自种类标号。
输出格式:
一行,只一个数M,最大可选奶牛数。
输入输出样例
输入样例:
6 3 2
0 1 1 1 2 1 3 2 2 1 2 2 1
输出样例:
5
说明
样例说明:
选择:1,2,3,5,6,这样只有1#和2#两种细菌。
思路:牛过多,可以枚举细菌方案,再依次检测每头牛是否可取。
代码:
//程序名:新的C++程序 //作者: #include<iostream> #include<fstream> #include<algorithm> using namespace std; int d,n,r,t,k,anss,a[20],b[2000][20],p[2000],c[20],tt,e,l; void cow() { for(int i=1;i<=d;i++) { l=0; for(int j=1;j<=k;j++) { if(b[i][j]==1&&c[j]==0){l=1;break;} } if(!l)tt++; } } int main() { cin>>d>>n>>r; if(n==r){cout<<d;return 0;} t=r;k=n; for(int i=1;i<=d;i++) { cin>>p[i]; for(int j=1;j<=p[i];j++)cin>>e,b[i][e]=1; } for(int i=1;i<=r;i++)a[i]=i; for(;;) { for(int i=1;i<=k;i++)c[i]=0; for(int i=1;i<=t;i++)c[a[i]]=1; tt=0; cow(); if(tt>anss)anss=tt; r=t;n=k;//个数和上限还原 a[t]++; while(a[r]>n)//直到不用进位为止 { a[r-1]++; r--;//末尾指针减少 n--;//上限减少 } if(a[0]!=0)break; for(int i=r+1;i<=t;i++)a[i]=a[i-1]+1;//如有进位再初始化 } cout<<anss; return 0; }