Новости:

Новая редакция правил форума: 2.4. Если вопрос или ответ содержится во вложенном файле, все-равно кратко описывайте в сообщении вопрос или суть решения. Это необходимо, чтобы тему можно было найти через поиск.

Главное меню

Получить комбинацию всех чисел из заданного набора

Автор mixail77, 17.10.2014, 20:09

« назад - далее »

mixail77

Здравствуйте.

Подскажите, пожалуйста, как решить следующую задачу. Нужно получить всевозможные комбинации цифр из заданного набора чисел. Заданный набор чисел может состоять из 1 или 50 и более чисел.

Например:

Базовый набор: 1, 2, 5, 8, 9, 12

В результате должны получиться следующие комбинации (в столбик):

1) из 1 числа - [1]-[2]-[5]-[8]-[9]-[12]...
2) из 2 чисел - [1][2]-[1][5]-[1][8]-[1][9]-[1][12]-[2][1]...
3) из 3 чисел - [1][2][5]-[1][2][8]-[1][2][9]-[1][2][12]-[1][5][2]-[1][5][8]...
4) из 4 чисел - [1][2][5][8]-[1][2][5][9]-[1][2][5][12]-[1][2][8][5]-[1][2][8][9]-[1][2][8][12]...
5) из 5 чисел...
6) из 6 чисел...

Желательно чтобы параметр "количество цифр в комбинации" можно было задать самостоятельно. Например, нужно сделать выборку всевозможных комбинаций (из базового набора) состоящих из пяти цифр.

Есть отличный пример макроса от администратора (https://forum.msexcel.ru/index.php/topic,915.msg5270.html?PHPSESSID=e96a2b94d4292cbb7f170d576957b93a#msg5270) который делает как раз то, что нужно.

Но в нем есть ограничение базового набора в 7 цифр. Если попытаться увеличить количество цифр, например до 16 путем редактирования строки ElseIf Selection.Count < 8 Then  тогда выскакивает ошибка - Subscript out of range

Прошу вашей помощи.

Спасибо.

MCH

Какова конечная цель, что нужно сделать с полученными числами? нужно произвести какие-то расчета в дальнейшем с целью найти оптимальный вариант?
Может быть вместо получения перечня чисел нужно сразу вычислять оптимальный вариант без формирования списка чисел?

MCH

Дополнительный вопрос:
Нужны ли перестановки чисел, например, числа 1, 2 и 2, 1 это два разных набора или один?

mixail77

Добрый вечер.

Цитата: MCH от 17.10.2014, 20:26
Какова конечная цель, что нужно сделать с полученными числами? нужно произвести какие-то расчета в дальнейшем с целью найти оптимальный вариант?
Может быть вместо получения перечня чисел нужно сразу вычислять оптимальный вариант без формирования списка чисел?

На выходе нужно просто получить максимально полный "массив" комбинаций цифр для заданного набора. Никаких арифметических действий с полученным массивом выполнять не нужно.

Цитата: MCH от 17.10.2014, 20:31
Дополнительный вопрос:
Нужны ли перестановки чисел, например, числа 1, 2 и 2, 1 это два разных набора или один?

Да, это один набор.

[1,2,3] и [2,3,1] - [3,10,21,6] и [10,21,6,3] – это тоже варианты одного набора. Их нужно исключить.

Добавлю ещё что, внутри одной комбинации цифры не должны повторяться.

MCH


mixail77

#5
Цитата: MCH от 17.10.2014, 21:10вариант
Попробовал поставить 30 цифр в базовый набор.
В результате выскочило окошко:
Run-time error '1004'
application-defined or object-defined error
В макросе подсвечивается строка: [h1].Offset(rws, 0).Resize(k, m) = b

Можно ли сделать, чтобы отдельные цифры в комбинациях были обрамлены в []? Чтобы их можно было, потом как-то отделить друг от друга?


MCH

Цитата: mixail77 от 17.10.2014, 21:28
Попробовал поставить 30 цифр в базовый набор.
В результате выскочило окошко:
2^30 это более миллиарда комбинаций, на лист Excel столько не поместится.
И зачем Вам столько вариантов?

Максимально, сколько можно перебрать вариантов и отобразить на листе данным макросом - это сочетания из 20 чисел (2^20-1 = 1048575). Если чисел больше, то перебрать сочетания также можно, но на лист они не поместятся.

Цитата: mixail77 от 17.10.2014, 21:28
Можно ли сделать, чтобы отдельные цифры в комбинациях были обрамлены в []? Чтобы их можно было, потом как-то отделить друг от друга?
Так Вам цифры нужно отделять или числа? не вижу необходимости разделять числа скобками, т.к. каждое число находится в своей ячейке. Так их легче использовать, нежели потом выделять из текстовой строки числа находящиеся внутри скобок.

mixail77

Цитата: mixail77 от 17.10.2014, 21:28
Попробовал поставить 30 цифр в базовый набор.
В результате выскочило окошко:
Цитата: MCH от 17.10.2014, 22:05
2^30 это более миллиарда комбинаций, на лист Excel столько не поместится.
И зачем Вам столько вариантов?

Максимально, сколько можно перебрать вариантов и отобразить на листе данным макросом - это сочетания из 20 чисел (2^20-1 = 1048575). Если чисел больше, то перебрать сочетания также можно, но на лист они не поместятся.

Да, многовато получается.

Тогда есть ли возможность в макросе прямо указать, что нужны все комбинации, например, только из 5 цифр? Возможно, в этом случае макрос будет отрабатывать корректно?

Если указать количество цифр в комбинации нельзя, возможен ли вариант писать "все" в файл?

Но предпочтительней конечно первый вариант с явным указанием количества цифр в комбинации.

Цитата: mixail77 от 17.10.2014, 21:28
Можно ли сделать, чтобы отдельные цифры в комбинациях были обрамлены в []? Чтобы их можно было, потом как-то отделить друг от друга?
Цитата: MCH от 17.10.2014, 22:05Так Вам цифры нужно отделять или числа? не вижу необходимости разделять числа скобками, т.к. каждое число находится в своей ячейке. Так их легче использовать, нежели потом выделять из текстовой строки числа находящиеся внутри скобок.

Согласен. Это не нужно.

MCH

Цитата: mixail77 от 17.10.2014, 22:18возможен ли вариант писать "все" в файл?
файл с миллиардом вариантов комбинаций будет размером несколько гигабайт, с такими файлами достаточно сложно работать

во вложении вариант с ограничением выборки

mixail77

#9
Цитата: MCH от 17.10.2014, 22:37
Цитата: mixail77 от 17.10.2014, 22:18возможен ли вариант писать "все" в файл?
файл с миллиардом вариантов комбинаций будет размером несколько гигабайт, с такими файлами достаточно сложно работать
И хочу уточниться на будущее. Если вдруг понадобится вариант писать в файл, он реализуем?

Спасибо вам огромное, MCH.