zoukankan      html  css  js  c++  java
  • 幂集的计算

    求一个集合的幂集就是求一个集合的所有的子集,方法有穷举法,分治法,回溯等,这里使用回溯法。

    回溯法是设计递归过程的一种重要的方法,它的求解过实质上是一个先序遍历一棵“状态树”的过程,只是这棵树不是遍历前预先建立的,而是隐含在遍历过程中的。

    幂集中的每个元素是一个集合,它或是空集,或含集合A中一个元素,或含集合A中两个元素…… 或等于集合A。反之,从集合A 的每个元素来看,它只有两种状态:它或属幂集的无素集,或不属幂集的元素集。则求幂集p(A)的元素的过程可看成是依次对集合A中元素进行“取”或“舍”的过程,并且可以用一棵二叉树来表示过程中幂集元素的状态变化过程,树中的根结点表示幂集元素的初始状态(空集);叶子结点表示它的终结状态,而第i层的分支结点,则表示已对集合A中前i-1个元素进行了取舍处理的当前状态(左分支表示取,右分支表示舍 )。因此求幂集元素的过程即为先序遍历这棵状态树的过程。

    求集合A={}的幂集可以从元素的角度看,即每个元素只有两个状态,取或者不去。则求幂集的过程可以看成是依次对集合A中元素进行取或者不取操作,

    并且可以用一颗树二叉树来表示。

    #include<iostream>
    using namespace std;
    typedef char Elem;
    void output(Elem a[],int n)
    {
        for(int i=1;i<n+1;i++)
        {
            if(a[i]!=0)
            {
                cout<<a[i];
            }
        }
        cout<<endl;
    }

    void GetPowerSet(int i,int n,Elem a[],Elem b[])
    {
        if(i>=n)
            output(b,n);
        else
        {
            Elem x=a[i];
            b[i+1]=x;
            GetPowerSet(i+1,n,a,b);
            b[i+1]=0;
            GetPowerSet(i+1,n,a,b);
        }
    }

    int main()
    {
        Elem a[100]={'a','b','c','d'};
        Elem b[100];
        GetPowerSet(0,4,a,b);
        return 0;
    }

  • 相关阅读:
    [zjoi2012]灾难——拓扑排序+灭绝树
    [bzoj3590]Quare——状压DP
    [bzoj4144]Petrol——最小生成树+最短路
    [bzoj2407]探险——重构图+最短路
    [bzoj2725]故乡的梦——最短路+线段树
    [bzoj2118]墨墨的等式——同余最短路
    [loj2736][JOISC 2016 Day3]回转寿司——分块+堆
    PHP学习笔记二十四【Get Set】
    PHP学习笔记二十三【This】
    PHP学习笔记二十二【静态方法二】
  • 原文地址:https://www.cnblogs.com/hutao886/p/4502064.html
Copyright © 2011-2022 走看看