元の動的計画法アルゴリズムが適用されますが、わずかに拡張されています。部分的な合計を記憶することに加えて、合計を取得するために使用されるintの数も記憶する必要があります。
元のアルゴリズムでは、ターゲットの合計がM
であり、n
整数があると仮定して、ブールn
xM
配列A
を入力します。ここで、最初のintから(任意の数の)を選択することで合計を達成できるA[i,m]
場合はtrueです(0からのインデックス付けを想定)。m
i+1
これを3次元配列xxに拡張できますn
。これは、同様のプロパティを持ちます。これは、最初のintから正確に選択することで合計が得られるM
場合に当てはまります。k
A[i,m,l]
m
l
i+1
intsが配列にあると仮定しますj[0..n-1]
:
漸化式は非常に似ています-フィールドA[0,j[0],1]
はtrue(選択、 1 int(duh)でj[0]
合計を取得)、他のフィールドはfalse、 fromからのフィールドの派生も元のアルゴリズムと同様です:trueの場合はtrue(if最初のintから選択でき、次に明らかに最初のintから選択できます)またはtrueの場合(選択した場合は、合計を1増やし、intの数を1増やします)。j[0]
A[0,*,*]
A[i+1,*,*]
A[i,*,*]
A[i+1,m,l]
A[i,m,l]
m
i
m
i+1
A[i, m - j[i+1], l-1]
j[i+1]
j[i+1]
が小さい場合は、明らかに上記の部分をすべてスキップして、 intk
のすべての組み合わせを繰り返し処理し、それらの合計を確認するのが理にかなっています。確かに賢明なしきい値のようです。k
k<=4