幂集合[集合论]

已知集合S,S的幂集合是指集合S所有子集的集合,用P(S)来表示,例如:

P({0,1,2})={$,{0},{1},{2},{0,1},{0,2},{1,2},{0,1,2}};

这让我想起二进制模拟,假如现在用算法模拟打印幂集合(空集除外),该怎么办呢?
二进制模拟起到很好的作用,首先来看一下,二进制模拟是什么,如图:

数组初始为0,循环在首位+1,按照二进制格式进位,最终会得到下面的可能:

1  0  0  0  0
0  1  0  0  0
1  1  0  0  0...
假如有3个元素,组合则有7种形式,加上空集,即为幂集合的所有可能性!

完整代码

#include <iostream>
using namespace std;
int main()
{
    int carry=1;
    int a[5]={0};/*状态数组*/
    int b[5]={0,1,2};/*集合数组*/
    int n=7;
    while(n>0)
    {
        for(int i=0;i<5;i++)/*每次得到一种状态*/
        {
            a[i]+=carry;
            carry=a[i]/2;
            a[i]=a[i]%2;
            if(carry==0)
            break;
        }
        for(int j=0;j<5;j++)/*遍历数组状态,打印幂集*/
        {
            if(a[j]==1)
            cout<<b[j]<<" ";
        }
        cout<<endl;
        --n;
        carry=1;/*复位*/
    }
    return 0;
}
时间: 2024-10-21 07:04:36

幂集合[集合论]的相关文章

UVa 1374 - Power Calculus——[迭代加深搜索、快速幂]

解题思路: 这是一道以快速幂计算为原理的题,实际上也属于求最短路径的题目类型.那么我们可以以当前求出的幂的集合为状态,采用IDA*方法即可求解.问题的关键在于如何剪枝效率更高.笔者采用的剪枝方法是: 1)如果当前状态幂集合中的最大元素max满足 max*2^(maxd-cur_d)<n,则剪枝.原因是:在每一次状态转移后,max最多增大一倍.(maxd-cur_d)次转移之后,max最多变成原来的2^(maxd-cur_d)倍,然而如果当前状态的极限情况下仍有max<n,则当前状态结点一定无法

【集合论】 03 - 序集和序数

1. 势 在上一篇我提过自然数“量”和“序”的双重性质,如果再仔细斟酌,“量”其实是由“序”产生和决定的,把有限的元素按某个顺序排列起来,正是我们确定其数量的过程.那么对于无穷集,“量”和“序”还有这样的关系吗?无穷集的“量”和“序”又该如何定义呢?既然它们产生于自然数,那么答案自然就在自然数的扩展中.对于有限集的量\(n\),可以看作是有限集的元素与\(n\)的元素的一一对应.这个直观的方法同样适用于无穷集,如果能找到一个标尺,将无穷集的元素和标尺的元素一一对应,那就能得到无穷集的“量”. 暂

【集合论】 02 - 集合与自然数

1. 公理系统 先来看看康托尔对集合的定义:“一个集合是我们知觉中或理智中的.确定的.互不相同的事物的一个汇集,被设想为一个整体”.尽管康托尔本人已经建立起了相当广泛而深刻的集合理论,但对于集合本身的定义却还是含糊的,他的理论被称为“朴素集合论”(Native Set Theory).虽然试图描述集合的每个属性,但其中“汇集”.“整体”等词其实是和“集合”等价的.定义的含糊使得各种悖论趁虚而入,这也成为反对者们的主要攻击目标.之后,策梅洛(Zermelo)为集合建立了一套公理化系统,并由弗兰克尔

Vim命令合集

来源:Vim命令合集 命令历史 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令. 启动vim 在命令行窗口中输入以下命令即可 vim 直接启动vim vim filename 打开vim并创建名为filename的文件 文件命令 打开单个文件 vim file 同时打开多个文件 vim file1 file2 file3 ... 在vim窗口中打开一个新文件 :open file 在新窗口中打开文件 :split file 切换到下一个文件 :bn 切换到上一

[转载]VIM命令合集

Vim命令合集 http://www.cnblogs.com/softwaretesting/archive/2011/07/12/2104435.html 命令历史 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令. 启动vim 在命令行窗口中输入以下命令即可 vim 直接启动vim vim filename 打开vim并创建名为filename的文件 文件命令 打开单个文件 vim file 同时打开多个文件 vim file1 file2 file3 ..

前端资源教程合集

综合类 前端知识体系 前端知识结构 Web前端开发大系概览 Web前端开发大系概览-中文版 Web Front-end Stack v2.2 En类资源汇总 免费的编程中文书籍索引 前端书籍 前端免费书籍大全 前端知识体系 免费的编程中文书籍索引 智能社 - 精通JavaScript开发 重新介绍 JavaScript(JS 教程) 麻省理工学院公开课:计算机科学及编程导论 JavaScript中的this陷阱的最全收集--没有之一 JS函数式编程指南 JavaScript Promise迷你书

设计模式09-组合模式

1. 概念 有时候又叫做部分-整体模式    存在整体和部分的时候  希望客户端忽略整体和部分的区别 2. 案例 /********************************************************************** * <pre> * FILE : Demo01.java * CLASS : Demo01 * * AUTHOR : Liaokailin * * FUNCTION : TODO * * *=========================

纸质压合垫有什么特效

纸质压合是一种独特的纸纤维产品,为强化刚性多层板.挠性印刷电路板.金属基电路板.软硬结合板的压合工艺而设计,具有优良的缓冲性.导热均匀.均衡压力.耐高温.环保等特性,可以代替进口PACOPADS压合垫.根据客户需求裁切各种大小规格,亦可按照纸进行PIN孔加工服务.

拆分集合为相等的子集合(第1届第1题)

题目要求 问题描述:将1到N的连续整数组成的集合划分为两个子集合,且保证每个集合的数字和相等.例如,对于N=4,对应的集合{1,2,3,4},能被划分为{1,4}.{2,3}两个集合,使得1+4=2+3,且划分方案只有此一种.编程实现给定任一正整数N(1<=N<=39),输出其符合题意的划分方案数. 样例输入1:3 样例输出1:1    (可划分为{1,2}.{3}) 样例输入2:4 样例输出2:1    (可划分为{1,3}.{2,4}) 样例输入3:7 样例输出3:4    (可划分为{1