それで、私は自分の問題の良い解決策を探していました。
整数のリストのすべての組み合わせを生成(印刷)する必要があります。たとえば、配列に0からn-1までの整数が含まれている場合、n = 5の場合:
int array[] = {0,1,2,3,4};
組み合わせの整数の順序は重要ではありません。つまり、{1,1,3}、{1,3,1}、および{3,1,1}は、すべて1つの3と2つの組み合わせが含まれているため、実際には同じ組み合わせです。
したがって、上記の配列の場合、長さ3のすべての組み合わせ。
0,0,0 -> the 1st combination
0,0,1
0,0,2
0,0,3
0,0,4
0,1,1 -> this combination is 0,1,1, not 0,1,0 because we already have 0,0,1.
0,1,2
0,1,3
0,1,4
0,2,2 -> this combination is 0,2,2, not 0,2,0 because we already have 0,0,2.
0,2,3
.
.
0,4,4
1,1,1 -> this combination is 1,1,1, not 1,0,0 because we already have 0,0,1.
1,1,2
1,1,3
1,1,4
1,2,2 -> this combination is 1,2,2, not 1,2,0 because we already have 0,1,2.
.
.
4,4,4 -> Last combination
今のところ私はこれを行うためのコードを書きましたが、私の問題は次のとおりです:配列内の数値が0からn-1までの整数でない場合、配列がこのようであったかどうかを言いましょう
int array[] = {1,3,6,7};
私のコードはこの場合、この問題を解決するためのアルゴリズムやコードでは機能しません、、
これが私のコードです:
unsigned int next_combination(unsigned int *ar, int n, unsigned int k){
unsigned int finished = 0;
unsigned int changed = 0;
unsigned int i;
for (i = k - 1; !finished && !changed; i--) {
if (ar[i] < n - 1) {
/* Increment this element */
ar[i]++;
if (i < k - 1) {
/* Make the elements after it the same */
unsigned int j;
for (j = i + 1; j < k; j++) {
ar[j] = ar[j - 1];
}
}
changed = 1;
}
finished = i == 0;
}
if (!changed) {
/* Reset to first combination */
for (i = 0; i < k; i++){
ar[i] = 0;
}
}
return changed;
}
そしてこれがメインです:
int main(){
unsigned int numbers[] = {0, 0, 0, 0, 0};
const unsigned int k = 3;
unsigned int n = 5;
do{
for(int i=0 ; i<k ; ++i)
cout << numbers[i] << " ";
cout << endl;
}while (next_combination(numbers, n, k));
return 0;
}