用于打印阵列所有子集的所有排列的函数

时间:2016-02-09 11:36:42

标签: c++ math recursion

打印出所有可能的子集以及每个子集的每次可能重新排列。

Ex: s = [1,2]
子集 s = [[],[1],[2],[1,2]],
每个子集的每个可能的排列: [[],[1],[2],[1,2],[2,1]],

2 个答案:

答案 0 :(得分:2)

这是让你知道如何做的事情(你必须自己编写代码,特别是因为我不写C ++)。最好的方法是递归:

getSubcombinations(Combination comb, Set set){
     for a in set{
         newSet=set \ {a}
         getSubcombinations(comb+a, newSet)
     }
     print(comb);
}

该方法调用自身,使用元素“a”和restset的每个组合(不设置a)增加当前子集,如果不添加其他元素,还会给出当前子集。如果你的集合没有重复(它是一个集合!),这不会产生重复的组合(这是你要求的,而不是子集!)。

答案 1 :(得分:0)

#include <iostream>
#include <vector>
#include <algorithm>

void subsets(int n, int r)
    {
    std::vector<bool> v(n);
    std::fill(v.begin(), v.begin() + r, true);

    do  {
        std::vector<int> p;
        for (int i = 0; i < n; ++i) 
            if (v[i]) 
                p.push_back(i);
        do  {
            std::cout << " { ";
            for(auto i : p)
                std::cout << i << ' ';
            std::cout << "} ";
            } while(std::next_permutation(p.begin(), p.end()));
        } while (std::prev_permutation(v.begin(), v.end()));
    }

void subsets(int n)
    {
    for(int r=0; r<=n; ++r)
        subsets(n, r);
    }

int main() 
    { 
    subsets(4); 
    }