假设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.
任何其他动态编程解决方案?
答案 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是我们正在寻找它有多少加数的数字。
我们试试吧。
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. (注意:加数仅为正数。)
(您可以尝试其他数字,检查我们的公式是否正确。)
答案 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)