与N个数相加的和S的方法数

时间:2011-01-03 21:14:58

标签: algorithm sum dynamic-programming

假设S = 5且N = 3,解决方案看起来像 - < 0,0,5> < 0,1,4> < 0,2,3> < 0,3,2> < 5,0,0> < 2,3,0> < 3,2,0> < 1,2,2>等等。

在一般情况下,可以使用N个嵌套循环来解决问题。运行N嵌套循环,在其中检查循环变量是否加到S。

如果我们提前不知道N,我们可以使用递归解决方案。在每个级别中,运行从0到N的循环,然后再次调用函数本身。当我们达到N的深度时,看看获得的数字是否加起来为S.

任何其他动态编程解决方案?

6 个答案:

答案 0 :(得分:8)

试试这个递归函数:

f(s, n) = 1                                    if s = 0
        = 0                                    if s != 0 and n = 0
        = sum f(s - i, n - 1) over i in [0, s] otherwise

要使用动态编程,您可以在评估后缓存f的值,并在评估之前检查缓存中是否已存在该值。

答案 1 :(得分:6)

有一个封闭形式公式:二项式(s + n - 1,n)

这些数字是单面数字

如果要计算它们,请使用log gamma函数或任意精度算法。

请参阅https://math.stackexchange.com/questions/2455/geometric-proof-of-the-formula-for-simplex-numbers

答案 2 :(得分:5)

我有自己的公式。我们和我的朋友吉奥一起就此发表了一份调查报告。我们得到的公式是[2 raised to (n-1) - 1],其中n是我们正在寻找它有多少加数的数字。

我们试试吧。

  • 如果n为1:其加数为o。我们可以添加两个或更多数字来获得1的总和(不包括0)。让我们尝试更高的数字。
  • 让我们试试4. 4 has addends: 1+1+1+1, 1+2+1, 1+1+2, 2+1+1, 1+3, 2+2, 3+1。它的总数是7。 让我们检查公式。 2升至(4-1) - 1 = 2升至(3) - 1 = 8-1 = 7.
  • 让我们尝试15. 2上升到(15-1) - 1 = 2上升到(14) - 1 = 16384 - 1 = 16383.因此,有16383种方法可以添加等于15的数字。

(注意:加数仅为正数。)

(您可以尝试其他数字,检查我们的公式是否正确。)

答案 3 :(得分:3)

这可以通过以下方式在O(s+n) (或O(1),如果您不介意approximation中计算:

想象一下,我们有一个字符串,其中包含n-1 X和s o。因此,对于s = 5,n = 3的示例,一个示例字符串将是

oXooXoo

请注意,X将o分为三个不同的分组:长度为1,长度为2,长度为2.这对应于< 1,2,2>的解决方案。每个可能的字符串为我们提供了一个不同的解决方案,通过计算行中的o的数量(可能为0:例如,XoooooX将对应于< 0,5,0>)。因此,通过计算此表单的可能字符串数量,我们可以得到您问题的答案。

s+(n-1) o有s个职位,所以答案是Choose(s+n-1, s)

答案 4 :(得分:0)

这实际上看起来很像河内塔的问题,没有仅在较大的磁盘上堆叠磁盘的限制。你有S盘可以在N塔上任意组合。这就是让我思考它的原因。

我怀疑有一个我们可以演绎的公式,不需要递归编程。我需要更多的时间。

答案 5 :(得分:0)

有一个固定的公式可以找到答案。如果你想找到获得N作为R元素之和的方法的数量。答案总是: (N + R-1)!/((R-1)!*(N)!) 或换句话说: (N + R-1) C (R-1)