/ / C ++アルゴリズム - 与えられた数のすべての可能な組み合わせを返す - c ++、アルゴリズム、再帰

指定された数のすべての可能な組み合わせを返すC ++アルゴリズム - c ++、アルゴリズム、再帰

可能なすべての組み合わせを見つけようとしています。

例:入力1 2 3 4 5

出力 図1において、 図2において、 図3では、 図4において、 図5において、 図21において、 31、 図32において、 41、 42、 図43において、 51、 52、 53、 54、 321、 421、 431、 432、 521、 531、 532、 541、 542、 543、 4321、 5321、 5421、 5431、 5432、 54321

(すべての数字は、この順序にする必要があります - 最大から最小まで)

私はソートされた配列を持っています。私はこれらの数字を書こうとしていますが、それは完璧にうまくいきますが、3 3 2 2 1のような複数の同じ数字を入力するとうまくいきません。

悪いことは、これは再帰が必要だということです。

私の基本アルゴリズムは次のようになります:(そのより複雑ですが、これは基本構造です)

extract(arrWithNumbers, PrintingArray) {

For(i = 0; 0 < Numbers in array; i++) {
if (numbers == i + 1) print(PrintingArray);
PrintingArray[i] = arrWithNumbers[i];
extract(arrWithNumbers, PrintingArray);
}
}

私を助けることができる既知のアルゴリズムはありますか?

可能なすべての組み合わせを見つけることだけでなく

組み合わせ式

ありがとう、時間と助けのために。

回答:

回答№1は1

コード例:

#include <stdio.h>

int next_combination(size_t *I, size_t k, size_t n)
{
size_t i, j;
i = k-1;                            /* find next element to increment */
while(I[i] == (n-k+i)){
--i;
if(i == (size_t)-1){            /* if done */
for(i = 0; i < k;  i++)     /*  return with initial combination */
I[i] = i;
return(0);
}
}
I[i] += 1;                          /* increment element */
for(j = i+1; j < k; j++)            /* create increasing string */
I[j] = I[i]+j-i;
return(1);                          /* return with new combination */
}

int main(int argc, char **argv)
{
int    A[5] = {5, 4, 3, 2, 1};
size_t I[5];
size_t i, k, n;
n = sizeof(A)/sizeof(A[0]);         /* n things */
for(k = 1; k <= n; k++){            /* n things k at a time */
for(i = 0; i < k;  i++)         /* create initial combination */
I[i] = i;
do{                             /* display combinations */
for(i = 0; i < k; i++)
printf("%2d", A[I[i]]);
printf("n");
}
while(next_combination(I, k, n));
}
return(0);
}

回答№2の場合は0

それはいくつかのビットマジックで行うことができます:

std::vector<int> vec {5, 4, 3, 2, 1};
int n = vec.size();
int cap = 1 << n;
for( int i=1; i<cap; ++i )
{
for( int j=0; j<n; ++j )
{
if( i & (1<<j) ) cout << vec[j] << " ";
}
cout << "n";
}

1〜2 ^ nを通り、その数が存在するかどうかを示すビットを表す