C++ 从集合中生成所有可能的有序子集
我知道如何从包含位旋转的集合中生成所有可能的子集。比如说,C++ 从集合中生成所有可能的有序子集,c++,algorithm,C++,Algorithm,我知道如何从包含位旋转的集合中生成所有可能的子集。比如说, //Get if nth position's bit is set bool IsBitSet(int num, int bit) { return 1 == ((num >> bit) & 1); } int subsetMaxIterCount = pow(2, someList.size()); for (int i = 0; i < subsetMaxIterCount; i++) {
//Get if nth position's bit is set
bool IsBitSet(int num, int bit)
{
return 1 == ((num >> bit) & 1);
}
int subsetMaxIterCount = pow(2, someList.size());
for (int i = 0; i < subsetMaxIterCount; i++) {
vector<A> subset;
for (size_t i = 0; i < jobList.size(); i++)
{
if (IsBitSet(jobSubsetIdx, i)) {
//Add to subset here
}
}
//Here we have a subset for some i
}
//如果设置了第n个位置的位,则获取
布尔IsBitSet(整数,整数位)
{
返回1==((num>>位)&1);
}
int subsetMaxiteCount=pow(2,someList.size());
对于(int i=0;i
但是,这并没有考虑订购
例如,如果我有一组{1,2,3},上述算法将生成以下的子集:
{},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}
实际上我需要的是这个
{}、{1}、{2}、{3}、{1,2}、{1,3}、{2,2,3}、{2,1}、{2,1,3}、{2,3,1}、{3,1}、{3,1}、{3,2}、{3,1,2}、{3,1,2}、{3,2,1}
不确定上述列表是否详尽无遗。生成这样的东西的有效算法是什么?(顺便问一下,这是所有可能的具有置换的子集吗?我们使用位旋转生成子集的方式,每个子集都在其中排序
,例如,{1,2,3},{2,3},{1,3}
。您可以使用next\u permutation
vector<vector<int>> mySubsetGenerator(vector<vector<int>>& subsets) {
vector<vector<int>> extendedSubset;
for(int i = 0; i < subsets.size(); ++i) {
do {
extendedSubset.push_back(subsets[i]);
} while(next_permutation(subsets[i].begin(), subsets[i].end()));
}
return extendedSubset;
}
vector mySubsetGenerator(向量和子集){
向量扩展子集;
对于(int i=0;i
此外,通过获取数组的一个或多个元素,您只能使用回溯来生成所有可能的排列。是。生成子集,然后为每个子集生成置换。std::next_置换和std::prev_置换投票关闭,因为缺少可复制的示例我有一个关于操纵杆方向问题的答案。