Векторний розділ розбиває вектор на ряд векторів таким чином, що їх сума є початковою. Ось кілька розділів:
[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]
, і всі вони унікальні (ви можете перевірити унікальність, спершу сортуючи кожен розділ лексикографічно).
Виграє найкоротший код у байтах.