2016-04-19 107 views
1

我怎樣才能找到一個數組的子集,其元素的總和在給定的範圍內?找到一個範圍內的子集

例如:

let a = [ 1, 1, 3, 6, 7, 50] 
let b = getSubsetSumRange(3, 5) 

所以B可能是[1,1,3],[1,3],[3],[1,3];我只需要其中一個的順序並不重要。

+1

這真的是不受限制的嗎?你爲什麼不走陣列並選擇第一個可接受的值? –

+0

在排序數組後可能會這樣做? –

+0

好的,是的,排序將是確定的第一步,這就是爲什麼我寫它已經排序。問題是在範圍內可能沒有單個元素,我可能不得不訴諸使用2個或更多。對於這種情況,我正在處理它將很可能是它的元素子集而不是單個元素 – luis

回答

1

你可能會喜歡用動態規劃的方法來解決這個問題。

F[i][j]具有價值true如果有可能從原來的子集a[1..i]所以選擇數字中的一些數字,他們的總和等於j。

i將明顯變化從1到的a長度,並且從j0包含性max,其中max是從給定的範圍內的第二數目。

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值後,你可以找到任何F[n][j]true爲趴在理想範圍值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 
+0

我不明白這是如何回答這個問題 – luis

+0

對於你範圍內的每一個數字,你可以檢查是否有可能得到一個子集與相應的總和 –

+0

我不知道這是否會幫助我,聽起來超級低效。我正在處理多達數百個範圍 – luis

相關問題