POJ PKU 2436 位运算
(2010-04-24 08:55:36)
标签:
pojpku2436it |
分类: 杂题 |
题目描述:给你一些集合n,让你从中取一些集合求并,并之后集合的元素个数不能超过k。问你最多取多少集合。
解题报告: 由于这题d的上线为15,可以用2进制来表示第i头牛的生病情况 以样例为例,对于牛的情况先全部转化成2进制形式 000 100 010 001 110 110 题目中的k为要求最大携带种类 这里k=2 然后生成排列
把他赋值给sta 利用位运算中的|来判断 对于每个排列都对牛群进行一次遍历 如果sta==(sta|a[i]),表示这头牛合适,合适的总数就是这种排列的答案。
最后选取最大的那个即可。
代码如下:
#include<iostream>
using namespace std;
int n, d, k, x[1001], y[16], num, temp, len, ans;
void Jeogia(int deep, int from, int sta)
{
if (deep == len)
{
int cnt = 0;
for(int i = 0; i < n; i )
if (sta == (sta | x[i]))
cnt ;
if (cnt > ans) ans = cnt;
return;
}
for(int i = from; i < d; i )
Jeogia(deep 1, i 1, sta y[i]);
}
int main()
{
y[0] = 1;
for(int i = 1; i <= 14; i ) y[i] = y[i - 1] * 2;
scanf("%d%d%d", &n, &d, &k);
for(int i = 0; i < n; i )
{
scanf("%d", &num);
x[i] = 0;
while(num--)
{
scanf("%d", &temp);
x[i] |= (1 << (temp - 1));
}
}
ans = 0;
for(len = 0; len <= k; len )
Jeogia(0, 0, 0);
printf("%d\n", ans);
return 0;
}