Я пытаюсь создать список подмножеств из набора. Например, если бы у меня было n = 6 и r = 4, у меня было бы 15 возможных комбинаций, которые были бы следующими:
0 1 2 3
0 1 2 4
0 1 2 5
0 1 3 4
0 1 3 5
0 1 4 5
0 2 3 4
0 2 3 5
0 2 4 5
0 3 4 5
1 2 3 4
1 2 3 5
1 2 4 5
1 3 4 5
2 3 4 5
Мой текущий код работает с вышеуказанными подмножествами, если n = 6 & r = 4. Это также работает, если любая другая комбинация n-r = 2. Это не работает ни для чего другого, и у меня возникли некоторые проблемы с отладкой, так как мой код имеет смысл для меня. У меня есть следующий код:
int array[r];
int difference = n-r;
for(int i = 0; i < r; i++){
array[i] = i;
}
while (array[0] < difference){
print (array, r);
for(int i = r-1; i >= 0; i--){
if ((array[i] - i) == 0){
array[i] = array[i] + 1;
for (int j = i+1; j < r; j++){
array[j] = j + 1;
}
i = r;
}
else{
array[i] = array[i] + 1;
}
print (array, r);
}
}
}
Чтобы дать некоторый контекст, когда я подключаю n = 6 и r = 3, я должен иметь 20 комбинаций в качестве выхода. Только 14 напечатаны, однако:
0 1 2
0 1 3
0 1 4
0 2 3
0 2 4
0 3 4
1 2 3
1 2 4
1 3 4
2 3 4
2 3 4
2 3 5
2 4 5
3 4 5
Первый и последний выходные данные выводятся правильно, однако мне необходимо распечатать и исправить все выходные данные. Я вижу, что после 3-й итерации код начинает давать сбой, так как вместо 0 1 4 он переходит к 0 1 5. Любые предложения относительно того, что я делаю неправильно?
Вот то, что я думаю, вы пытаетесь сделать. Насколько я могу судить, ваша главная проблема в том, что основной for
цикл должен начинаться заново после увеличения элемента массива до допустимого значения, а не продолжения.
Так что эта версия только звонки print
в одном месте и использует break
выбраться из главного for
петля. Он также считает найденные комбинации.
#include <iostream>
void print(int array[], int r) {
for(int i=0; i<r; ++i) {
std::cout << array[i] << ' ';
}
std::cout << '\n';
}
int main() {
static const int n = 6;
static const int r = 3;
static const int difference = n-r;
int array[r];
for(int i = 0; i < r; i++) {
array[i] = i;
}
int count = 0;
while(array[0] <= difference) {
++count;
print(array, r);
for(int i=r-1; i>=0; --i) {
++array[i];
if(array[i] <= difference + i) {
for(int j=i+1; j<r; ++j) {
array[j] = array[j-1] + 1;
}
break;
} } }
std::cout << "count: " << count << '\n';
}
Выходы
0 1 2
0 1 3
0 1 4
0 1 5
0 2 3
0 2 4
0 2 5
0 3 4
0 3 5
0 4 5
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5
count: 20
Других решений пока нет …