zoukankan      html  css  js  c++  java
  • 回溯法求幂集

       集合A的幂集是由集合A的所有子集所组成的的集合,如:A={1,2,3},则A的幂集P(A)={{1,2,3},{1,2},{1,3},{1},{2,3},{2},{3},{ }},求一个集合的幂集就是求一个集合的所有的子集,方法有穷举法,分治法,回溯等,这里主要介绍一下回溯法。

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

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

    void Powerset(int i,int n)

    {

     if(i>n) 输出幂集的一个元素

    else{

           取第i个元素,PowerSet(i+1,n);

           舍第i个元素,PowerSet(i-1,n);

    }

    具体代码:

    #include<iostream>
    using namespace std;
    int n,*num1,*num2;
    int k=0;
    /*
    输入 1 2 3
    输出:{{1,2,3,},{1,2,},{1,3,},{1,},{2,3,},{2,},{3,},{}}请按任意键继续. . .
    */
    void GetPowerSet(int i)
    {
        if(i>n)
        {
            cout<<"{";
            for(int j=0;j<k;j++)
            {
                cout<<num2[j]<<",";
            }
            cout<<"}";
            if(k) cout<<",";
        }
        else
        {
    
            num2[k]=num1[i];
            k++;
            GetPowerSet(i+1);
    
            k--;
            GetPowerSet(i+1);
        }
    }
    
    int main()
    {
         
        cout<<"请输入集合中的元素个数";
        cin>>n;
        num1=new int[n+1];
        num2=new int[n+1];
        cout<<"请输入"<<n<<"个元素"<<endl;
        for(int i=1;i<=n;i++)
        {
            cin>>num1[i];
        }
        cout<<"{";
        GetPowerSet(1);
        cout<<"}";
    }
  • 相关阅读:
    JVM系列-001-JVM监控工具
    Java8-CompletableFuture
    Java8-ConcurrentUtils
    Java8-LongAccumulator
    Java8-Atomic
    Java8-ConcurrentHashMap
    Java8-Synchronized-No.02
    Java8-Synchronized-No.01
    Java8-Executors-No.03
    Java8-Executors-No.02
  • 原文地址:https://www.cnblogs.com/youxin/p/3219523.html
Copyright © 2011-2022 走看看