【问题标题】:Count number of ways to divide a number in 4 parts计算将数字分成 4 部分的方法
【发布时间】:2015-11-30 06:27:54
【问题描述】:

给定一个正整数 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 if k > target or (target > 0 and k = 0)

f(target, k) = f(target-k, k) + f(target-1, k-1)

有人能告诉我这个解决方案吗?

【问题讨论】:

  • f(target, k) = f(target-k, k) + p(target-1, k-1)p是什么功能?

标签: algorithm recursion dynamic-programming


【解决方案1】:

该解决方案是正确的,但有点棘手,我会尽力为您解释清楚。

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

但是从另一个角度来看,您可以将图像视为 9 行(1*4, 1*4, 1*4 , 1*4, 1*3, 1*2, 1*2, 1*1, 1 *1)。

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

所以我们来了解详细信息:

  • f(target, k) = f(target-k, k) + f(target-1, k-1)
  • f(target, k): target 瓷砖剩余,行长为k
  • f(target - k, k): 放一行长度k
  • f(target - 1, k - 1):只在最右列放一个图块(确保答案为正整数),并将行长减1。

就是这样。

如果你还有什么问题,可以在这里留言。

【讨论】:

    【解决方案2】:

    给定一个数字 n,找出可以将 n 表示为 x1+x2+x3+x4 之和的方式数,使得 xi&gt;=0 答案将是(n+3)C(3) 一般x1+x2+x3+...+xn=k with xi&gt;=0有解决方案(k+n-1)C(n-1) 这里,k=n,n=4。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-11
      • 1970-01-01
      • 2022-01-15
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多