Показать сообщение отдельно
Старый 04.12.2015, 21:31   #1
DarkInside
Разработчик
 
Аватар для DarkInside
 
Регистрация: 08.08.2011
Сообщений: 505
Написано 191 полезных сообщений
(для 369 пользователей)
Полный перебор всех сочетаний элементов в массиве

Приветствую.
Подскажите, пожалуйста, по алгоритмике.
Есть массив из 30-60 элементов (количество плавающее). Нужно перебрать все сочетания его элементов. При этом элементы в конечной строке не должны повторяться, а также повторяющиеся сочетания (при перестановке элементов) не должны учитываться, то есть 1+2+3+4 = 1+3+2+4 = 1+4+2+3 = 4+1+2+3 и т.д. - это всё одно и то же, повторы нужно игнорировать, оставить только один из них - например, 1+2+3+4.
Расписал пример для 4 элементов:
1) - (пусто)
2) 1
3) 1+2
4) 1+2+3
5) 1+2+3+4
6) 1+2+4
7) 1+3
8.) 1+3+4
9) 1+4
10) 2
11) 2+3
12) 2+3+4
13) 2+4
14) 3
15) 3+4
16) 4

Вроде всего получается (количество элементов)^2 вариантов сочетаний. С 4-мя элементами всё просто, можно 4 цикла вложенных написать, но вот с 30-60 элементами это не выход. Может рекурсию какую-нибудь написать, не могу сообразить.
Может кто делал на блице подобное?

UPD: вроде допёр, что от повторений можно избавиться переводом сочетаний в бинарную матрицу. 1 = 1000; 1+2 = 1100; 1+2+3 = 1110 ... 1+2+3+4 = 1111
То есть нужна бинарная матрица

Последний раз редактировалось DarkInside, 04.12.2015 в 23:12.
(Offline)
 
Ответить с цитированием