Векторное разбиение разбивает вектор на ряд векторов так, что их сумма является исходной. Вот пара разделов:
[3, 1, 2] = [3, 1, 2]
[3, 1, 2] = [0, 0, 1] + [0, 0, 1] + [0, 1, 0] + [1, 0, 0] + [2, 0, 0]
[3, 1, 2] = [1, 1, 2] + [2, 0, 0]
Здесь сложение векторов выполняется поэлементно. Допустимый раздел не содержит векторов с отрицательными целыми числами или вектора с нулем.
Теперь задача состоит в том, чтобы написать программу или функцию, которая генерирует все возможные векторные разбиения по заданному вектору. Это может звучать относительно легко ...
... но есть поворот. Если входной вектор имеет размер L, а самый большой раздел, который он генерирует, имеет M элементов, вы не можете использовать больше, чем O (L * M) памяти.
Вы можете предположить, что целое число использует O (1) памяти. Это означает, что вы должны выводить разделы по мере их создания. Кроме того, вы должны выводить каждый раздел только один раз. Например, это один и тот же раздел:
[3, 1, 2] = [3, 0, 2] + [0, 1, 0]
[3, 1, 2] = [0, 1, 0] + [3, 0, 2]
Если вы должны были вывести оба, ваш ответ неверен.
Все разделы для [3, 2]
:
[3, 2]
[0, 1] + [3, 1]
[0, 1] + [0, 1] + [3, 0]
[0, 1] + [0, 1] + [1, 0] + [2, 0]
[0, 1] + [0, 1] + [1, 0] + [1, 0] + [1, 0]
[0, 1] + [1, 0] + [2, 1]
[0, 1] + [1, 0] + [1, 0] + [1, 1]
[0, 1] + [1, 1] + [2, 0]
[0, 2] + [3, 0]
[0, 2] + [1, 0] + [2, 0]
[0, 2] + [1, 0] + [1, 0] + [1, 0]
[1, 0] + [2, 2]
[1, 0] + [1, 0] + [1, 2]
[1, 0] + [1, 1] + [1, 1]
[1, 1] + [2, 1]
[1, 2] + [2, 0]
Чтобы проверить свой ответ, запустите его [3, 2, 5, 2]
. Он должен генерировать 17939 разделов, каждый из которых суммируется [3, 2, 5, 2]
и является уникальным (вы можете проверить уникальность, сначала отсортировав каждый раздел лексикографически).
Самый короткий код в байтах побеждает.