配列の要素の合計が所定の範囲内にある場合、どうすればその部分集合を見つけることができますか?例えば範囲内の合計でサブセットを見つける
:
let a = [ 1, 1, 3, 6, 7, 50]
let b = getSubsetSumRange(3, 5)
ので、Bは、潜在的に[3]、[1,3]、[3,1]、[3、1、1]とすることができます。私はそれらのうちの1つだけを必要とする順序は関係ありません。
配列の要素の合計が所定の範囲内にある場合、どうすればその部分集合を見つけることができますか?例えば範囲内の合計でサブセットを見つける
:
let a = [ 1, 1, 3, 6, 7, 50]
let b = getSubsetSumRange(3, 5)
ので、Bは、潜在的に[3]、[1,3]、[3,1]、[3、1、1]とすることができます。私はそれらのうちの1つだけを必要とする順序は関係ありません。
この問題を解決するには、動的プログラミングアプローチを使用することをお勧めします。
は、彼らの合計がJに等しくなるように、元のサブセットa[1..i]
から番号のうち、いくつかの数字を選択することが可能である場合F[i][j]
は値true
てみましょう。
i
は明らか1
からa
の長さに変化し、0
からmax
はあなたの指定された範囲から第二の数で包括max
へj
う。
F[i][0] = true
すべてi
(常に空のサブセットを選択できます)。
その後F[i][j] = F[i - 1][j - a[i]] | F[i - 1][j]
論理的に、それはあなたが要素1..i-1
から合計j
とのサブセットを選択することができれば、あなたは明らかにサブセット1..i
でそれを行うことができ、あなたが要素から合計j - a[i]
とのサブセットを選択することができるかどうかということ1..i-1
を入力し、そのサブセットに新しい要素a[i]
を追加することで、希望の合計j
を得ることができます。
あなたがF
の値を計算した後、ご希望の範囲にある値j
ためtrue
ある任意のF[n][j]
見つけることができます。
あなたがこのような番号k
を見つけたとします。次に、必要なセットを見つけるアルゴリズムは、次のようになります。
for i = n..1:
if F[i - 1][k - a[i]] == True then
output a[i] to the answer
k -= a[i]
if k == 0
break
本当にそれは拘束されていませんか?なぜあなたは配列を歩いて最初の許容値を選んでいないのですか? –
おそらく配列をソートした後にそれを行うのでしょうか? –
さて、ソートは確実に最初のステップになるでしょう。だから、私はそれを既にソートしました。問題は、範囲内に単一の要素がない可能性があり、2つ以上を使用する必要があるかもしれないということです。その場合、私はそれが単一の要素ではなく要素のサブセットになる可能性が非常に高いと考えています – luis