打印出所有可能的子集以及每个子集的每次可能重新排列。
Ex: s = [1,2]
子集 s = [[],[1],[2],[1,2]],
每个子集的每个可能的排列: [[],[1],[2],[1,2],[2,1]],
答案 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);
}