Существует множество вопросов и ответов для комбинированных алгоритмов, но во всех моих поисках я нигде не видел этой проблемы. Это такая же математическая задача, как и задача кодирования.
Проблема:
Если у меня есть набор отличительных предметов и набор незаметных ящиков, как мне найти все? комбинации предметов в коробках?
Имейте в виду, что нам нужно не просто количество комбинаций, которые должна выводить программа, все возможные комбинации.
Правила:
- Все объекты должны использоваться
- Порядок размещения объектов в поле не имеет значения
- Порядок Ящики расположены неважно
- У ящиков нет ограничений на количество предметов, которые они могут содержать
- Единственное, что отличает ящик, это предметы, которые он содержит
Примеры эквивалентности:
- [ab] [cd] [] эквивалентно [ab] [] [cd]
- [abcd] [] [] is равно [bdac] [] []
- [ab] [c] [d] эквивалентно [ab] [d] [c]
могу сядьте с ручкой и бумагой, чтобы вытянуть все комбинации, но я не могу понять, какой алгоритм использует мой мозг.
В этом коде a, b, c и d являются элементами.
std::vector<char> unsorted = { 'a', 'b', 'c', 'd' };
int box_count = 3;
std::vector<std::vector<std::vector<char>>> sorted = {};
sorted = FillBoxes(unsorted, box_count);
Ожидаемый результат:
sorted = {
{ {a}, {b}, {c,d}},
{ {a}, {b,c}, {d} },
{ {a}, {b,d}, {c} },
{ {a}, {b,c,d}, {} },
{ {a,b}, {c}, {d} },
{ {a,b}, {c,d}, {} },
{ {a,c}, {b}, {d} },
{ {a,c}, {b,d}, {} },
{ {a,d}, {b}, {c} },
{ {a,d}, {b,c}, {} },
{ {a,b,c}, {d}, {} },
{ {a,b,d}, {c}, {} },
{ {a,c,d}, {b}, {} },
{ {a,b,c,d}, {}, {} }
}
Я ищу логический алгоритм, который выполняет работу FillBoxes()
и выводит список, как показано в sorted
.
У меня был несколько идей с участием бинарных деревьев и итерационных указателей b но никто из них не работал. Это выглядит как решаемая проблема, но если это математически невозможно, я также буду признателен за обратную связь.
Спасибо!
(предпочтительный язык c ++, но я могу читать самые распространенные языки программирования)