我怎樣才能找到一個數組的子集,其元素的總和在給定的範圍內?找到一個範圍內的子集
例如:
let a = [ 1, 1, 3, 6, 7, 50]
let b = getSubsetSumRange(3, 5)
所以B可能是[1,1,3],[1,3],[3],[1,3];我只需要其中一個的順序並不重要。
我怎樣才能找到一個數組的子集,其元素的總和在給定的範圍內?找到一個範圍內的子集
例如:
let a = [ 1, 1, 3, 6, 7, 50]
let b = getSubsetSumRange(3, 5)
所以B可能是[1,1,3],[1,3],[3],[1,3];我只需要其中一個的順序並不重要。
你可能會喜歡用動態規劃的方法來解決這個問題。
讓F[i][j]
具有價值true
如果有可能從原來的子集a[1..i]
所以選擇數字中的一些數字,他們的總和等於j。
i
將明顯變化從1
到的a
長度,並且從j
到0
包含性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
這真的是不受限制的嗎?你爲什麼不走陣列並選擇第一個可接受的值? –
在排序數組後可能會這樣做? –
好的,是的,排序將是確定的第一步,這就是爲什麼我寫它已經排序。問題是在範圍內可能沒有單個元素,我可能不得不訴諸使用2個或更多。對於這種情況,我正在處理它將很可能是它的元素子集而不是單個元素 – luis