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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2013, 21:52   #1
Anubys
Форумчанин
 
Регистрация: 08.05.2010
Сообщений: 177
По умолчанию Перебор всєх возможных варіантов множества

Сразу скажу, что мне нужен совет по алгоритму перебора. Вводим 1> чисел. Для примера вводим 25, 45, 65. Начинаем перебор с (25, 25, 25, 25, 25), исходим из перебора (65, 65, 65, 65, 65). Все указанные числа могут повторяться произвольное число раз.
Anubys вне форума Ответить с цитированием
Старый 01.04.2013, 23:26   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

во-первых, множество, в данном случае, не очень подходящий тип данных, лучше использовать массив.

во-вторых, вообще ничего сложного.
смотрите, у вас есть массив с исходными элементами.
Пусть элементы пронумерованы от 0 до 2 (т.к. всего три элемента)
0-й элемент - это 25
1-й элемент - это 45
2-й элемент - это 65

теперь заполняем структуру (это либо ещё один массив, либо строка, либо любая другая структура, где можно легко перебирать элементы по индексу)
числами 0, 0, 0, 0, 0
это начальная позиция (когда будем ещё выводить, получится 25, 25, 25, 25, 25)
прибавляем 1.
получаем 0, 0, 0, 0, 1 (когда будем ещё выводить, получится 25, 25, 25, 25, 45)
прибавляем 1.
получаем 0, 0, 0, 0, 2 (когда будем ещё выводить, получится 25, 25, 25, 25, 65)
прибавляем 1.
получаем 0, 0, 0, 1, 0 {у нас 3-элемента, поэтому, максимальный индекс может быть 2}
обращаем внимание, что при добавлении единицы учитываем возникающий перенос в более старший разряд..
(когда будем ещё выводить, получится 25, 25, 25, 45, 25)

прибавляем 1.
получаем 0, 0, 0, 1, 1 (когда будем ещё выводить, получится 25, 25, 25, 45, 45)
прибавляем 1.
получаем 0, 0, 0, 1, 2
прибавляем 1.
получаем 0, 0, 0, 2, 0
и т.д.

разумеется, прибавляем 1 в цикле, до тех пор, пока после очередного прибавления не возникнет перенос из старшего разряда.

вот и всё!

p.s. C/C++ я не знаю, примером кода помочь не смогу..
Но, если Вы поняли алгоритм, Вы сами легко напишете программу
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.04.2013, 23:55   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Serge_Bliznykov, понравился алгоритм - не удержался и реализовал
Код:
#include <iostream>
#include <cstring>

using namespace std;

int
main()
{
    int a[] = {1, 2, 3}, n = sizeof(a) / sizeof(a[0]), b[n], i, k = 0;
    memset(b, 0, sizeof(a));
    while (!(k++)) {
        for (int j = 0; j < n; ++j) {
            cout << a[b[j]] << " ";
        }
        cout << endl;
        i = n - 1;
        do {
            b[i] += k;
            k = b[i] / n;
            b[i--] %= n;
        } while (i > -1 && k);
    }
    cout << "That's all" << endl;
    return 0;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 02.04.2013 в 00:10.
BDA на форуме Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
с++ Перебор всех возможных подмножеств множества целых чисел Modlika17 Помощь студентам 19 10.01.2012 11:09
Перебор всех возможных вариантов phenix Помощь студентам 3 03.12.2010 21:29
Перебор возможных комбинаций в матрице N*N Руслан_911 Помощь студентам 3 25.11.2010 20:35
Перебор возможных комбинаций символов Toxask8 Общие вопросы C/C++ 1 12.12.2009 21:33
Перебор всех возможных вариантов [MI_nor] Общие вопросы C/C++ 9 01.04.2009 21:17