查找范围内的sum的子集

时间:2016-04-19 22:36:04

标签: algorithm math

如何找到一个数组的子集,其元素总和在给定范围内?

例如:

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

所以b可能是[1,1,3],[1,3],[3],[1,3];我只需要其中一个顺序无关紧要。

1 个答案:

答案 0 :(得分:2)

您可能希望使用动态编程方法来解决此问题。

如果可以从原始子集F[i][j]中的数字中选择一些数字,那么true的值为a[1..i],以便它们的总和等于j。

i显然会从1a的长度变化,j0变为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