加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

POJ PKU 2436 位运算

(2010-04-24 08:55:36)
标签:

poj

pku

2436

it

分类: 杂题

题目描述:给你一些集合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;
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有