我怎样才能找到一个数组的子集,其元素的总和在给定的范围内?找到一个范围内的子集
例如:
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