ベクトルパーティションは、ベクトルを一連のベクトルに分割し、合計が元になるようにします。パーティションは次のとおりです。
[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)メモリを使用すると仮定できます。つまり、パーティションを生成するときに出力する必要があります。さらに、各パーティションを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]
であり、すべて一意です(最初に各パーティションを辞書式に並べ替えることで一意性をテストできます)。
バイト単位の最短コードが優先されます。