(の決定版)あなたの問題はまだNP完全です。問題を解決できれば、(各サブセット サイズについて) 合計が V 未満になるセットの数と、合計が V-1 未満になるセットの数を求めることができ、これら 2 つの数値の差は次のようになります。部分集合の合計が正確に V になるかどうかを教えてください。したがって、部分集合和の問題を解くことができます。[これは完全な証明ではありません。チューリング簡約であり、多数の簡約ではありません。]
ただし、時間 O(nLV) で実行される単純な動的計画法のソリューションがあります。[これが P=NP であることを証明しない理由は、V が入力サイズで指数関数的である可能性があるためです: n ビットでは、2 nまでの値を表すことができます。しかし、V が指数関数的でないと仮定すると、これは問題ではありません。]
num[v][k][i] は、合計が v になる S の最初の i 要素のサイズ k サブセットの数を示します。それらは (i ごとに) 次のように計算できます。
num[0][0][i] = 1
for v = 1 to V:
for k = 1 to L:
num[v][k][i] = num[v][k][i-1] + num[v-S[i]][k-1][i-1]
ここで、S[i] はシーケンスの i 番目の要素です。(合計が v になるサイズ k のセットは、S[i] を使用しないため、num[v][k][i-1] でカウントされるか、S[i] を使用します。つまり、残りのサブセットは k-1 個の要素を持ち、シーケンスの最初の i-1 個の数のみを使用し、合計すると vS[i] になります。) 最後に、V より小さい各 v について num[v][L][|S|] を数えます。 ; それがあなたの答えです。
また、慎重に行う場合は、3 番目の添え字を省略できます (i ごとに下向きにループを実行するなど)。わかりやすくするためにのみ含めました。