Disease Manangement 疾病管理

posted on 2019-10-02 16:52:42

Disease Manangement 疾病管理

题面如下

\(N\) 头牛,它们可能患有 \(D\) 种病,现在从这些牛中选出若干头来,但选出来的牛患病的集合中不过超过 \(K\) 种病。

输入格式

从标准输入读入数据。

第一行输入三个正整数 \(N(N \leq 1000)\)\(D(D \leq 15)\)和$ K(K \leq D)$。

接下来 \(N\) 行,每行先输入一个整数 \(a_i (a_i \leq D)\),然后输入 \(D\) 个正整数 \(b_{ij} (b_{ij} \leq D)\),代表第 \(i\) 头牛患的 \(a_i\) 种病。

输出格式

输出到标准输出。

输出一个整数,为最多能选出牛的数量。

样例输入

6 3 2
0
1 1
1 2
1 3
2 2 1
2 2 1

样例输出

5
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
using namespace std;
int n, d, k, ds[1005], sum, ans;
bool check(int s)
{
    int cnt = 0;
    for(int i = s; i; i >>= 1) {
        cnt += i & 1;
    }
    return cnt <= k;
}
int main()
{
    cin >> n >> d >> k;
    for(int i = 1; i <= n; i++) {
        int a, x;
        cin >> a;
        for(int j = 1; j <= a; j++) {
            cin >> x;
            ds[i] += (1 << (x - 1));
        }
    }
    for(int i = 1 ;i < (1 << d); i++) {
        if(check(i)) {
            sum = 0;
            for(int j = 1; j <= n; j++) {
                if((ds[j] | i) == i) {
                    sum++;
                }
            }
            ans = max(ans, sum);
        }
    }
    cout << ans;
return 0;
}

猜你喜欢

转载自www.cnblogs.com/xuanfly/p/11808557.html