Это хороший вопрос.По сути, это проблема разделов с ограниченным набором.
Вот один из способов, которым вы можете подойти к этому.Я не уверен, что он является оптимальным, но он во много раз эффективнее грубой силы (генерирует все перестановок и затем удаляет дубликаты).
Я буду использовать фигурные скобки для представления списков, как это мне знакомо.
Начните с этого шаблона, который представляет ноль элементов в трех бинах:
{ {{}, {}, {}} }
Для каждого списка в самом внешнем (то есть просто {{}, {}, {}}
здесь):
Добавлять 1
к каждому подсписку, пропуская все полные списки (содержащие три элемента), и добавлять только в первый пустой список {}
, если имеется большечем один.
Сохраните копию всего списка для каждой произведенной замены и объедините их вместе в конце шага.
Этот процесс будет повторяться для 2
, 3
и т. Д., Пока все элементы не будут в ячейках или все ячейки не заполнятся.Примеры шагов:
{ {{}, {}, {}} }
{ {{1}, {}, {}} }
{ {{1, 2}, {}, {}}, {{1}, {2}, {}} }
{ {{1, 2, 3}, {}, {}}, {{1, 2}, {3}, {}}, {{1, 3}, {2}, {}}, {{1}, {2, 3}, {}}, {{1}, {2}, {3}} }
{ {{1, 2, 3}, {4}, {}}, {{1, 2, 4}, {3}, {}}, {{1, 2}, {3, 4}, {}}, {{1, 2}, {3}, {4}}, {{1, 3, 4}, {2}, {}}, {{1, 3}, {2, 4}, {}}, {{1, 3}, {2}, {4}}, {{1, 4}, {2, 3}, {}}, {{1}, {2, 3, 4}, {}}, {{1}, {2, 3}, {4}}, {{1, 4}, {2}, {3}}, {{1}, {2, 4}, {3}}, {{1}, {2}, {3, 4}} }