计算将数字分成4个部分的方法数

时间:2015-11-30 06:27:54

标签: algorithm recursion dynamic-programming

给定正整数n,找到将n分成四部分或将n表示为四个正整数之和的方法的数量。这里n从0到5000不等。

def foo(target, k, j):
    count = 0
    map = {} 
    if target in map.keys() and map[target] == k:
        return map[target]
    if target == 0 and k == 0:
        return 1
    if target <= 0 or k < 0:
        return 0
    for i in range(j, target+1):
        count += foo(target-i, k-1, i)
    map[target] = count
    return count

print(foo(10, 4, 1))

我用上面的递归解决方案解决了这个问题,但我刚看到有人使用以下动态编程解决方案。

f(0,0)= 1

f(target,k)= 0如果k>目标或(目标> 0和k = 0)

f(目标,k)= f(目标-k,k)+ f(目标-1,k-1)

有人可以启发我这个解决方案吗?

2 个答案:

答案 0 :(得分:1)

这个解决方案是正确的,但有点棘手,我会尽力向你说清楚。

如果target=25我们将其拆分为25=9+7+5+4。我们用4列(1 * 9,1 * 7,1 * 5,1 * 4)表示:

25=9+7+5+4

但另一方面,您可以将图像视为9行(1 * 4,1 * 4,1 * 4,1 * 4,1 * 3,1 * 2,1 * 2,1 * 1,1 * 1)。

因此,您会发现您的解决方案是按列方式构建图像,该解决方案是按行方式。

所以我们来看看这个解决方案的细节:

  • f(目标,k)= f(目标-k,k)+ f(目标-1,k-1)
  • f(目标,k):保留target个图块,行的长度为k
  • f(target-k,k):放一行k
  • f(target - 1,k - 1):只将一个图块放到最右边的列中(确保答案是正整数),并将行的长度减少1。

这就是全部。

如果您还有任何疑问,可以在这里留言。

答案 1 :(得分:0)

给定数字n,找到可以表示为x1+x2+x3+x4之和的方式的数量xi>=0 答案是(n+3)C(3) 通常,x1+x2+x3+...+xn=k with xi>=0有解决方案(k+n-1)C(n-1) 这里,k = n且n = 4。