递归中的整数划分问题

递归中的整数划分问题

问题描述:

对于一个整数 n,想要将其划分为正整数若干之和。设这些正整数为 $ {m_i}
$,显然 0 < m i ≤ n 00<min

对于一个划分,若 m a x ( m i ) ≤ m max(m_i) \leq m max(mi)m,则我们称这种划分为 n n n m m m划分,将其记为 N ( n , m ) N(n,m) N(n,m)

那么,针对 m m m的不同取值,可以将问题不断退化。

  1. n = 1 n=1 n=1,问题即为对 1 1 1进行划分,那么方法仅有 1 1 1中。故 N ( 1 , m ) = 1 N(1,m)=1 N(1,m)=1.
  2. m = 1 m=1 m=1,问题即为将整数n划分为1的和,那么方法也只有一种,(m个1相加)。故 N ( n , 1 ) = 1 N(n,1)=1 N(n,1)=1.
  3. n = m n=m n=m,分为2种情况讨论:1:划分好的结果中最大数为n,那么划分法只有1种;2:划分好的结果中最大数小于n,问题退化为 N ( n , m − 1 ) N(n, m-1) N(n,m1).
  4. n < m nn<m,划分中的所有数字都不可能大于 n n n,问题退化为 N ( n , n ) N(n, n) N(n,n).
  5. n > m n>m n>m,分为2种情况讨论:1:划分好的结果中最大数为 m m m,问题退化为 N ( n − m , m ) N(n-m, m) N(nm,m);2:划分好的结果中最大数小于m,问题退化为 N ( n , m − 1 ) N(n, m-1) N(n,m1).

最后,按照上面思路实现代码即可。

def splitNum(n, m):
    if n == 1 or m == 1:
        return 1
    elif n > m:
        return splitNum(n-m, m) + splitNum(n, m-1)
    elif n < m:
        return splitNum(n, n)
    elif n == m:
        return 1 + splitNum(n, n-1)
    else:
        return NotImplementedError


print(splitNum(6, 6))

你可能感兴趣的:(数据结构,c++,leetcode)