Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.05.2018, 10:23   #1
Blackman9999
Пользователь
 
Регистрация: 27.01.2018
Сообщений: 20
По умолчанию Генерирование подмножеств с заданным количеством элементов - Дискретная математика

Задача: Создать программу для генерирования всех подмножеств с заданным количеством элементов. В контрольной работе привести листинг программы и все сгенерированные подмножества. Количество элементов подмножеств и универсальную множество выбрать согласно варианту.
Вариант №3. K = 4. U = {a, b, k, d, h, f}.

Код выводит 4 элемента множества и повторяет их.Что нужно добавить,чтобы разные буквы выводились с нового ряда,а не повторялось все снова.
Код:
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
int main()
{
    setlocale(LC_ALL, "RUS");
    char u[] = { 'a' , 'б', 'в', 'д', 'e', 'f' }; 
    int a = 4, b;
    for (int i = 0; i<a; i++)
        b = powf(2, a);
    for (int i = 0; i<b; i++)
    {
        cout << "{";
        for (int j = 0; j<a; j++)
            
                cout << u[j] << " ";
        cout << "}" << endl;
    }
 
    system("pause");
    return 0;
}
Blackman9999 вне форума Ответить с цитированием
Старый 01.05.2018, 14:42   #2
Blackman9999
Пользователь
 
Регистрация: 27.01.2018
Сообщений: 20
По умолчанию

Нашел нужный код,но символы прикрутить никак не могу.
Код:
#include <iostream>
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];
  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;
}
Blackman9999 вне форума Ответить с цитированием
Старый 03.05.2018, 09:35   #3
Blackman9999
Пользователь
 
Регистрация: 27.01.2018
Сообщений: 20
По умолчанию

ау??
Blackman9999 вне форума Ответить с цитированием
Старый 03.05.2018, 09:54   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

не уверен, что результат будет тот, что Вам нужно, но формально, ответ на вопрос

Цитата:
Сообщение от Blackman9999 Посмотреть сообщение
символы прикрутить никак не могу.
вот, "прикрутил" к вашему коду ваши символы:
Код:
#include <iostream>
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];
  return true;
}
void Print(int *a, int n, char *u) 
{
  static int num = 1;
  cout.width(3);
  cout << num++ << ": ";
  for (int i = 0; i < n; i++)
    cout << u[a[i]-1] << " ";
  cout << endl;
}
int main() 
{
  char u[] = {'a', 'b', 'k', 'd', 'h', 'f'};
  int n=6, m=4, *a;
  a = new int[n];
  for (int i = 0; i < n; i++)
    a[i] = 1;
  Print(a, m, u);
  while (NextSet(a, n, m))
    Print(a, m, u);
  cin.get(); cin.get();
  return 0;
}
проверить - https://ideone.com/bk3FAv


p.s. кстати, не знаю, что Вам нужно получить в вашем задании,
но это классический алгоритм Нарайаны для получения всевозможных перестановок в лексикографическом порядке.

Последний раз редактировалось Serge_Bliznykov; 03.05.2018 в 10:00.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.05.2018, 23:39   #5
Blackman9999
Пользователь
 
Регистрация: 27.01.2018
Сообщений: 20
По умолчанию

Спасибо Вам Великий.Особенно,за обозначение алгоритма.А то заданий еще таких хватает,а названий,способов мало знаю.Вот по немного учусь,та и на заочном не сильно нагружают,но и правда,даже список рекоменд.лит-ры не дали.
Blackman9999 вне форума Ответить с цитированием
Старый 05.05.2018, 15:27   #6
Blackman9999
Пользователь
 
Регистрация: 27.01.2018
Сообщений: 20
По умолчанию

Тот код отличный,но почитав,я понял,что надо без повторений элементов(как например все А А А А).Вот без повторений,мб кому-то пригодится:
Код:
#include "stdafx.h"
#include <iostream>
using namespace std;
void swap(int *a, int i, int j)
{
	int s = a[i];
	a[i] = a[j];
	a[j] = s;
}
bool NextSet(int *a, int n, int m)
{
	int j;
	do  // повторяем пока не будет найдено следующее размещение
	{
		j = n - 1;
		while (j != -1 && a[j] >= a[j + 1]) j--;
		if (j == -1)
			return false; // больше размещений нет
		int k = n - 1;
		while (a[j] >= a[k]) k--;
		swap(a, j, k);
		int l = j + 1, r = n - 1; // сортируем оставшуюся часть последовательности
		while (l < r)
			swap(a, l++, r--);
	} while (j > m - 1);
	return true;
}
void Print(int *a, int n, char *u)  // вывод размещения
{
	static int num = 1; // номер размещения
	cout.width(3); // ширина поля вывода номера размещения
	cout << num++ << ":  ";
	for (int i = 0; i < n; i++)
		cout << u[a[i]-1] << " ";
	cout << endl;
}
int main()
{
	int n=6, m=4, *a;
	char u[] = { 'a', 'b', 'k', 'd', 'h', 'f' };
	a = new int[n];
	for (int i = 0; i < n; i++)
		a[i] = i + 1;
	Print(a, m,u);
	while (NextSet(a, n, m))
		Print(a, m,u);
	cin.get(); cin.get();
	return 0;
}
Blackman9999 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
дискретная математика Zaraaa Помощь студентам 0 03.11.2013 17:38
Дискретная математика sergey163 Помощь студентам 2 24.10.2013 18:08
Дискретная математика zumm Свободное общение 6 30.10.2012 15:20
Дискретная математика olga) Помощь студентам 0 09.03.2012 10:06
дискретная математика. 13xXx13 Помощь студентам 1 26.03.2011 12:51