特定子集和的解的数量

时间:2014-03-12 23:01:16

标签: dynamic recursion

假设我们有一组:{1,2,...,n}。 有多少个阶R的子集存在S = {a_i1,a_i2,... a_iR},它们总和到一定数量S ?.这个问题的递归是什么?

1 个答案:

答案 0 :(得分:0)

只需定义解决原始问题的方法。它收到的参数是:

  • 要使用的最大数量(n),
  • 子集大小(R),
  • 子集sum(S),

并返回组合数。

要实现此方法,首先我们必须检查是否可以发出此请求。如果出现以下情况,则无法完成任务:

  • 子集大小大于可能元素的数量(R> n)
  • 最大可能总和小于S. n + (n-1) + ... + (n-R+1) < S => R*((n-R) + (R+1)/2) < S

之后,尝试更大元素的所有可能性就足够了。在python风格中,它应该实现如下:

def combinations(n, R, S):
  if R > n or R*((n-R) + (R+1)/2) < S:
    return 0
  c = 0
  for i in xrange(R, n+1):  # try i as maximal element in subset. It can go from R to n
    # recursion n is i-1, since i is already used
    # recursion R is R-1, since we put i in a set
    # recursion S is S-i, since i is added to a set and we are looking for sum without it
    c += combinations(i-1, R-1, S-i)
  return c