1

来自 codewars 的问题https://www.codewars.com/kata/52ec24228a515e620b0005ef/python

在数论和组合学中,正整数 n 的分区,也称为整数分区,是一种将 n 写为正整数之和的方式。仅在其被加数的顺序上不同的两个和被认为是相同的分区。如果顺序很重要,那么总和就变成了一个组合。例如,4 可以以五种不同的方式进行分区:

4
3 + 1
2 + 2
2 + 1 + 1
1 + 1 + 1 + 1

给定数字 n,编写一个函数 exp_sum(n),它返回 n 可以划分的方式总数。例如:exp_sum(4) = 5

为什么递归方法:

def exp_sum(n):
    arr = list(range(1, n+1))
    mem = {}
    return rec(n, arr, mem)


def rec(n, arr, mem):
    key = str(n)+ ":" + str(arr)
    if key in mem:
        return mem[key]
    elif n < 0:
        return 0

    elif n == 0:
        return 1

    elif n > 0 and not arr:
        return 0

    else:
        to_return = rec(n - arr[-1], arr, mem) + rec(n, arr[:-1], mem)

    mem[key] = to_return
    return to_return

与此特定方法(此 kata 的最佳解决方案)相比,运行时间要长得多?

def exp_sum(n):
  if n < 0:
    return 0
  dp = [1]+[0]*n
  for num in range(1,n+1):
    for i in range(num,n+1):
      dp[i] += dp[i-num]
  return dp[-1]

即使使用记忆化,递归方法也几乎无法在大约 10000 毫秒的时间内通过测试用例,而上述方法需要 1000 毫秒。

谁能解释上面的特定方法是如何工作的以及它背后的逻辑,或者它是否使用了一些我可以阅读的特定算法?

4

0 回答 0