细菌

题目描述

近期,农场出现了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;
}
代码

 

posted @ 2019-04-15 13:20  背‘水’一栈  阅读(162)  评论(0)    收藏  举报