Предположим, у меня есть массив, инициализированный с 0 размером n
.
Я хочу напечатать всю перестановку n
натуральных чисел, которая складывается в натуральное число k
.
Мой код на данный момент печатает только некоторые перестановки (правильные, но несколько пропущены).
Например, для n = 4
и k = 3
мой код печатает:
1 1 1 0
1 1 0 1
1 0 2 0
1 0 1 1
1 0 1 1
1 0 0 2
0 2 1 0
0 2 0 1
0 1 2 0
0 1 1 1
0 1 1 1
0 1 0 2
0 1 2 0
0 1 1 1
0 0 3 0
0 0 2 1
0 0 2 1
0 0 1 2
0 1 1 1
0 1 0 2
0 0 2 1
0 0 1 2
0 0 1 2
0 0 0 3
Вы можете видеть, что отсутствуют некоторые перестановки.Например: 3 0 0 0
и 0 3 0 0
, среди прочих.
Код:
#include <iostream>
void printArray(int* a, int arraySize){
for(int i = 0; i < arraySize; i++)
std::cout << a[i] << " ";
std::cout << std::endl;
}
int currentSum(int* a, int arraySize){
int sum = 0;
for(int i = 0; i < arraySize; i++)
sum += a[i];
return sum;
}
void printAll(int* a, int arraySize, int k, int beg){
for(int i = beg; i < arraySize; i++){
if(currentSum(a, arraySize) == k)
printArray(a, arraySize);
else{
a[i]++;
printAll(a, arraySize, k, beg+1);
a[i]--;
}
}
}
int main(){
int k = 3; //array must add up to k, exactly
int arraySize = 4;
int* a = new int[arraySize];
for(int i = 0; i < arraySize; i++)
a[i] = 0;
printAll(a, arraySize, k, 0);
}