将n写为k数之和的方法数

时间:2017-11-10 08:01:13

标签: algorithm math sum formula partitioning

所以我有这个公式:

P(n, 1) = P(n, n) = 1

P(n + k, k) = P(n, 1) + P(n, 2) + ... + P(n, k)

但我不明白。

我写错了吗? 我不明白为什么n+k

中有“P(n + k, k)

假设P是一个函数,我调用P(6, 2)P(n + k, k)做了什么?它会转换为P(8, 2)还是P(4 + 2, 2) ...

我不明白它是如何运作的,也许如果有人给我一个例子,一步一步......

2 个答案:

答案 0 :(得分:1)

两个公式线是数学定义,而不是编程算法。希望他们提供足够的信息,以便您可以找到任何P(x,y)的价值。

由于第一行有效地定义了两种不同的情况,我想重写公式:

(A) P(n, 1) = 1

(B) P(n, n) = 1

(C) P(n + k, k) = P(n, 1) + P(n, 2) + ... + P(n, k)

因此,如果您要将它们应用于P(6,2),那么只有(C)可以匹配,因为(A)仅匹配P(6,1)(B)之类的内容像P(6,6)这样的东西。

P(6,2)P(n+k,k)的匹配意味着k必须是2,而n+k必须是6,这意味着n=4 }}

然后(C)的右侧展开为P(4,1) + P(4,2)。它的第一部分与(A)匹配,第二部分与(C)匹配。因此,第一部分提供1,第二部分必须以与P(6,2)相同的方式进行扩展。等等...

如果要实现计算P(x,y)值的函数,那么直接的方法是将定义公式转换为递归计算。

答案 1 :(得分:0)

嗯,你必须一次又一次地应用公式

   P(6, 2) = P(4 + 2, 2) = P(4, 1) + P(4, 2)

现在P(4, 1)我们有

   P(4, 1) = P(3 + 1, 1) = P(3, 1) = P(2 + 1, 1) = P(2, 1) = P(1 + 1, 1) = P(1, 1) = 1

借助归纳,我们可以在P(N, 1) = 1

时证明N >= 1

P(4, 2)我们有

   P(4, 2) = P(2 + 2, 2) = P(2, 2) + P(2, 1) = 1 + P(2, 1) = 
           = 1 + P(1 + 1, 1) = 1 + P(1, 1) = 1 + 1 = 2

最后

   P(6, 2) = P(4 + 2, 2) = P(4, 1) + P(4, 2) = 1 + 2 = 3

一般情况下(再次归纳P(2 * N, 2) = N

最简单的 C#实现(对于某些输入不起作用,例如P(0, 1)):

private static Dictionary<Tuple<int, int>, int> s_Cached = 
  new Dictionary<Tuple<int, int>, int>();

private static int P(int n, int k) {
  if (n == k)
    return 1;

  if (s_Cached.TryGetValue(new Tuple<int, int>(n, k), out var value))
    return value;

  int result = 0;

  for (int i = 1; i <= k; ++i)
    result += P(n - k, i);

  s_Cached.Add(new Tuple<int, int>(n, k), result);

  return result;
}

测试

Console.WriteLine(P(6, 2));