Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 5
Регистрация: 23.09.2016
Сообщений: 254
1

Алгоритм генерации всех подмножеств с повторениями

14.11.2016, 09:10. Показов 2750. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Реализовать не рекурсивную версию алгоритма, генерирующего все подмножества с повторениями
я правильно понимаю использование подобного метода для решения?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using namespace std;
bool NextSet(int *a, int n, int m) {
  int j = m - 1;
  while (a[j] == n && j>=0) j--;
  if (j < 0) return false;
  if (a[j] >= n)
    j--;
  a[j]++;
  if (j == m - 1) return true;
  for (int k = j + 1; k < m; k++)
  a[k] = a[j]; // значения меньше a[j] уже использованы в сочетаниях
  return true;
}
void Print(int *a, int n) {
  static int num = 1;
  cout.width(3);
  cout << num++ << ": ";
  for (int i = 0; i < n; i++)
    cout << a[i] << " ";
  cout << endl;
}
int main() {
  int n, m, *a;
  cout << "N = ";
  cin >> n;
  cout << "M = ";
  cin >> m;
  int h = n > m ? n : m; // размер массива а выбирается как max(n,m)
  a = new int[h];
  for (int i = 0; i < h; i++)
    a[i] = 1;
  Print(a, m);
  while (NextSet(a, n, m))
    Print(a, m);
  cin.get(); cin.get();
  return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.11.2016, 09:10
Ответы с готовыми решениями:

Алгоритм генерации всех комбинаций
Здравствуйте, есть массив типа int, размер 256 в каждой ячейке цифра от 1 до 4. Нужен быстрый...

Алгоритм для нахождения всех подмножеств состоящих из n элементов одного множества
Подскажите пример программы/алгоритм для нахождения всех подмножеств из n элементов одного...

Алгоритм генерации всех возможных цепочек 0 и 1
Всем доброго времени суток! Во время написания диплома потребовалось написать программу следующего...

Алгоритм генерации всех возможных вариантов сочетания элементов
Собственно нужно написать алгоритм генерации всех возможных вариантов сочетания элементов, т.е. к...

5
189 / 177 / 111
Регистрация: 22.06.2009
Сообщений: 533
14.11.2016, 09:55 2
MerrinZ, Код генерирует не правильные значения (если я правильно понял что Вы хотите на выводе).
Не буду переписывать то что уже есть на этом форуме:
Генерация подмножеств множества(Бинарный код)
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
14.11.2016, 10:11 3
Нахождение всех подмножеств:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <clocale>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "");
    const int N = 6;
    int A[N];         // имеем множество A {1, ... N}
    for (int i = 0; i < N; i++)
        A[i] = i + 1; // заполняем множество
    int a[N] = {0};   // надо ли включать элемент множества
    int counter = 0;  // счетчик
    while (a[0] != 2) // пока не прошли все элементы
    {
        for (int i = 0; i < N; i++) // выводим подмножество
            if(a[i]) // если нужно печатать
                cout << A[i] << ' ';
        cout << endl;
 
        a[N-1]++; // увеличиваем последний разряд
        for (int i = N - 1; i > 0; i--) // если нужен сдвиг
            if(a[i] == 2) // увеличиваем след. разряд
            {
                a[i-1]++;
                a[i] = 0;
            }
        counter++; // увеличиваем счетчик на один
    }
    cout << "Всего подмножеств: " << counter << endl;
}
1
0 / 0 / 5
Регистрация: 23.09.2016
Сообщений: 254
15.11.2016, 19:57  [ТС] 4
что значат следующие строки, появились такие вопросы
Цитата Сообщение от MrGluck Посмотреть сообщение
const int N = 6;
почему берем именно константу
Цитата Сообщение от MrGluck Посмотреть сообщение
while (a[0] != 2)
ну и !=2
а также по разрядам
Цитата Сообщение от MrGluck Посмотреть сообщение
a[N-1]++
Цитата Сообщение от MrGluck Посмотреть сообщение
if(a[i] == 2)
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
15.11.2016, 22:39 5
Лучший ответ Сообщение было отмечено MerrinZ как решение

Решение

Цитата Сообщение от MerrinZ Посмотреть сообщение
почему берем именно константу
Чтобы создать статический массив размер должен быть известен на этапе компиляции. Есть расширение VLA, но оно не включено в стандарт С++.
Цитата Сообщение от MerrinZ Посмотреть сообщение
ну и !=2
когда первый разряд встаёт в 2, нам уже нечего увеличивать

Я вроде бы итак выложил код, где прокомментирована каждая строчка. Это из коллекции тех задач, которые я раньше делал на фрилансе, а теперь просто выкладываю на общественное достояние.
1
0 / 0 / 0
Регистрация: 23.02.2018
Сообщений: 38
12.04.2019, 14:41 6
А теперь скажите мне пожалуйста, как это должно выглядеть на C#? Особенно, если я хочу передать в некоторый двумерный массив все возможные подмножества длиною 2, подмножество соответственно будет вложено в такой массив так:первый элемент в "строке" 0, второй - в" строке" 1.
Спасибо!
0
12.04.2019, 14:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.04.2019, 14:41
Помогаю со студенческими работами здесь

Алгоритм перебора с повторениями
помогите написать код перебора вариантов) нашел ссылки...

Регулярное выражение (и алгоритм) текст с повторениями
Вопрос по регулярному выражению, (не умею я их делать ((( ) но может заодно подскажете простой...

Перевод с C++. Алгоритм генерирующий все подмножества с повторениями
это нерекурсивный алгоритм генерирующий все подмножества с повторениями #include &lt;iostream&gt;...

Генерация всех подмножеств множества
Создать програму которая будет генерировать все подмножества множества


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru