zoukankan      html  css  js  c++  java
  • 竞赛准备篇---(四)子集生成

    二进制枚举

      用n位二进制数表示一个集合的状态,全部为1表示全集,全部为0表示空集,比如集合{0, 1,2,3};那我就可以用数字0-15的来表示集合的各个子集,用二进制从右往左数的第i为表示集合中第i个元素的状态。

    数字 二进制 集合
    0 0000 空集
    1 0001 0
    2 0010 1
    3 0011 0,1
    4 0100 2
    5 0101 0,2
    6 0110 1,2
    7 0111 0,1,2
    8 1000 3
    9 1001 0,3
    10 1010 1,3
    11 1011 0,1,3
    12 1100 2,3
    13 1101 0,2,3
    14 1110 1,2,3
    15 1111

    0,1,2,3

     1 void print_subset(int n, int s)
     2 {
     3     for(int i = 0; i < n; i++)
     4         if(s&(1<<i))printf("%d ", a[i]);
     5     printf("
    ");
     6 }
     7 
     8 
     9     for(int i = 0; i < (1 << n); i++)
    10         print_subset(n, i);

     这里用整数表示集合

    集合A,B相交:A&B(二进制的&运算就可以直接完成)

    集合A,B相并:A|B

    集合A,B的对称差:A^B

    NOIP普及组、提高组培训,有意可加微信fu19521308684
  • 相关阅读:
    JavaScript引用类型
    Java08_方法
    网络爬虫(一)
    openCV(四)——鼠标绘制
    openCV(三)——视频
    openCV(二)——基础绘制函数
    openCV(一) 读取保存图像
    JAVA07-数组
    JAVA06-while循环,do while循环
    JAVA05-switch多重选择
  • 原文地址:https://www.cnblogs.com/fzl194/p/8668817.html
Copyright © 2011-2022 走看看