C++ C++;N!订单

C++ C++;N!订单,c++,permutation,factorial,C++,Permutation,Factorial,我有一个N个项目的列表,我想知道如何循环列表以获得每个组合。没有替身,所以我需要全副武装!订单。额外的内存不是问题,我正试图想出最简单的算法,但我遇到了麻烦。请参见C++STL为此所做的。扩展其他人的答案,下面是一个改编自 #包括 #包括 使用名称空间std; 无效输出阵列(整数*数组,整数大小) { 对于(int i=0;i

我有一个N个项目的列表,我想知道如何循环列表以获得每个组合。没有替身,所以我需要全副武装!订单。额外的内存不是问题,我正试图想出最简单的算法,但我遇到了麻烦。

请参见C++STL为此所做的。

扩展其他人的答案,下面是一个改编自

#包括
#包括
使用名称空间std;
无效输出阵列(整数*数组,整数大小)
{

对于(int i=0;i 伪代码

我没有测试它,但它应该工作。也许这不是最聪明的方法,但它是一个简单的方法。
如果出现问题,请告诉我!

尝试使用固定数量的可能元素递归地建立组合集。所有可能组合集将是1个元素、2个元素……最多N个元素组合集的并集


然后,您可以单独攻击每个固定大小的组合。

是组合还是置换?另请参阅两种不同算法的说明。
bool
变量中似乎没有任何点。您可以在(
do{…})同时执行(std::next_permutation(…)
@Charles:是的,我能做到。出于教学目的,我把下一个排列列出来,因为这是代码的重点。这很公平。就我个人而言,我发现没有额外的变量,它会更清晰,但可能只有我一个人。打得好(可以这么说)。尽管公平地说,OP要求的是最简单的算法。
#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;
}
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, {})