我有一个N项的列表,我想知道如何循环列表以获得每个组合。没有双打,所以我需要得到全部N!排序。额外的内存没有问题,我正在考虑最简单的算法,但我遇到了麻烦。
答案 0 :(得分:15)
答案 1 :(得分:8)
扩展其他人的答案,以下是改编自cplusplus.com
的std :: next_permutation的示例#include <iostream>
#include <algorithm>
using namespace std;
void outputArray(int* array, int size)
{
for (int i = 0; i < size; ++i) { cout << array[i] << " "; }
}
int main ()
{
int myints[] = { 1, 2, 3, 4, 5 };
const int size = sizeof(myints);
cout << "The 5! possible permutations with 5 elements:\n";
sort (myints, myints + size);
bool hasMorePermutations = true;
do
{
outputArray(myints, size);
hasMorePermutations = next_permutation(myints, myints + size);
}
while (hasMorePermutations);
return 0;
}
答案 2 :(得分:2)
为此,C ++ STL有next_permutation。
答案 3 :(得分:0)
使用递归的简单算法:
<强> 伪代码 强>
getPermutations(CurItemList , CurPermList)
if CurItemList.isempty()
return CurPermList
else
Permutations = {}
for i = 1 to CurItemList.size()
CurPermList.addLast(CurItemList.get(i))
NextItemList = CurItemList.copy()
NextItemList.remove(i)
Permutations.add(getPermutations(NextItemList, CurPermList))
CurPermList.removeLast()
return Permutations
// To make it look better
Permutations(ItemList)
return getPermutations(ItemList, {})
我没有测试它,但应该工作。也许它不是最聪明的方法,但它是一种简单的方法。 如果出现问题,请告诉我!
答案 4 :(得分:0)
尝试使用固定数量的可能元素递归地构建组合集。所有可能组合的集合将是1个元素,2个元素,......最多N个元素的组合集合。
然后你可以单独攻击每个固定大小的组合。