近期,农场出现了D(1≤D≤15)种细菌。John要从他的N(1≤N≤1000)头奶牛中尽可能多地选些产奶,但是如果选中的奶牛携带了超过K(1≤K≤D)种不同细菌,所生产的奶就不合格。请你帮助John计算出最多可以选择多少头奶牛。
标签:
近期,农场出现了D(1≤D≤15)种细菌。John要从他的N(1≤N≤1000)头奶牛中尽可能多地选些产奶,但是如果选中的奶牛携带了超过K(1≤K≤D)种不同细菌,所生产的奶就不合格。请你帮助John计算出最多可以选择多少头奶牛。
第1行:三个整数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
样例说明:选择l,2,3,5,6头奶牛,只有1#和2#两种细菌。
&运算符:
1&1 = 1, 0 & 1 = 0, 0 & 0 = 0;二进制数 1111
& 1001
得到 1001
因此可以把所有细菌变成二进制数,1, 2, 4,8,……
因此可以用枚举细菌 来 暴力检索 奶牛是否合适。
#include <iostream> #include <cstdio> #include <algorithm> #include <climits> using namespace std; const int maxn = 10010; const int INF = 0x3f3f3f3f; int Cnt(int x){ int cnt = 0; while(x > 0){ if(x&1) cnt++; x = x>>1; } return cnt; } int main() { int n, m, x, ans, num, a[maxn] = {0}; ios::sync_with_stdio(false); cin >> n >> m >> ans; for (int i = 0; i < n; i++){ cin >> num; for (int j = 0; j < num; j++) { cin >> x; a[i] += 1<<(x-1); } } int res = 0, MAX = 0; for(int i = 1; i <= (1 << m); i++){ if(Cnt(i) <= ans){ res = 0; for(int j = 0; j < n; j++){ if((a[j] & i) == a[j]) res++; } MAX = max(res, MAX); } } cout << MAX << endl; return 0; }
标签:
原文地址:http://www.cnblogs.com/cshg/p/5721304.html