Я пытаюсь сгенерировать список всех подмножеств r, из набора, n. Мой код работает, если n-r = 2, но если & gt; 2, выводит неверный вывод

Я пытаюсь создать список подмножеств из набора. Например, если бы у меня было 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. Любые предложения относительно того, что я делаю неправильно?

-2

Решение

Вот то, что я думаю, вы пытаетесь сделать. Насколько я могу судить, ваша главная проблема в том, что основной 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
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector