Мне нужны все возможные решения для
эти группы, так как это не трудно
найдите одно созвездие.
Обычно там 100! способы перестановки 100 элементов, но, так как вы сохраняете заказ, вы можете уменьшить размер вашей проблемы на существенно . То, что вы описываете, является проблемой целочисленного разбиения . Например, предположим, что вы разбили число 5 на все возможные целочисленные подмножества, которые складывают до 5, вы получите наборы {5}, {4, 1}, {3, 2}, {3, 1, 1 ,}, {2, 2, 1}, {2, 1, 1, 1}, {1, 1, 1, 1, 1}.
Число целочисленных разделов растет экспоненциально с размером целого числа, но экспоненциальный рост происходит достаточно медленно, так что вы можете перечислить все разделы с n = 100, поскольку их всего 190 569 292. Дополнительное ограничение заключается в том, что вы хотите отфильтровать все свои разделы для наборов, содержащих ровно 10 элементов, что легко перечислить, используя диаграмму Феррера.
Я могу продемонстрировать диаграмму Феррера, разделив число 20 на 3 сегмента: начните с сетки из 20 столбцов х 3 следующим образом:
12345678901234567890
1******************
2*
3*
Итак, первый раздел - {18, 1, 1}
Теперь переместите предмет с вершины стека в следующий слот:
12345678901234567890
1*****************
2**
3*
Наш новый раздел - {17, 2, 1}. Мы можем другой предмет из одного стека в другой:
12345678901234567890
1****************
2***
3*
Теперь у нас есть {16, 3, 1}. Вы продолжаете в том же духе, пока не перечислите все перестановки (это зависит от вас, является ли {17, 1, 2} отличным от {17, 2, 1} разделением).
С этого момента вы сможете представить общую схему алгоритма, который вам нужен - то есть, если вам нужна задача написания этой функции с нуля. Другие люди уже написали множество эффективных функций , чтобы легко решить проблему.