如何找到一个数组的子集,其元素总和在给定范围内?
例如:
let a = [ 1, 1, 3, 6, 7, 50]
let b = getSubsetSumRange(3, 5)
所以b可能是[1,1,3],[1,3],[3],[1,3];我只需要其中一个顺序无关紧要。
答案 0 :(得分:2)
您可能希望使用动态编程方法来解决此问题。
如果可以从原始子集F[i][j]
中的数字中选择一些数字,那么true
的值为a[1..i]
,以便它们的总和等于j。
i
显然会从1
到a
的长度变化,j
从0
变为max
,其中{{1}是你给定范围内的第二个数字。
max
适用于所有F[i][0] = true
(您始终可以选择空子集)。
然后i
逻辑上,这意味着如果您可以从元素F[i][j] = F[i - 1][j - a[i]] | F[i - 1][j]
中选择总和为j
的子集,那么您显然可以使用子集1..i-1
执行此操作,并且如果您可以选择子集使用元素1..i
中的总和j - a[i]
,然后将新元素1..i-1
添加到该子集,您就可以得到所需的总和a[i]
。
在您计算j
的值后,您可以找到F
F[n][j]
对于您所需范围内的值true
的{{1}}。
假设您找到了这样的号码j
。然后找到所需集合的算法将如下所示:
k