合計がいくつかの制限よりも小さいか等しい場合、最も効率的(時間とメモリ)の方法でサブセットの数を数えられるのでしょうか。例えば、セット{1, 2, 4}
と制限3
の場合、そのような数字は4(サブセットは{}, {1}, {2}, {1, 2}
です)です。私は、ビット・ベクトル(マスク)でサブセットを符号化し、以下の方法(擬似コード)に答えを見つけることを試みた:0-1回のナップザックの回数の組み合わせ
solve(mask, sum, limit)
if visited[mask]
return
if sum <= limit
count = count + 1
visited[mask] = true
for i in 0..n - 1
if there is i-th bit
sum = sum - array[i]
mask = mask without i-th bit
count (mask, sum, limit)
solve(2^n - 1, knapsack sum, knapsack limit)
アレイはゼロ基づいて、カウントがグローバル変数とvisited
することができる配列であります長さ2^n
。私は問題が指数関数的な複雑さを持っていることを理解していますが、私の考えにはより良いアプローチ/改善がありますか?アルゴリズムはn ≤ 24
で高速に実行されますが、私のアプローチは非常に力強いものです。たとえば、n = 30
の回答を見つけるための巧妙な方法の存在について考えていました。