整数划分
思路-自顶向下
- 整数划分一定是从最大的整数开始划分,那么思路很明确了
- 先定义一下函数q(n,m):的含义
- 当n=4的时候,我们从最大的开始划分,我们假设一个函数q(n,m)
- q(n,m)的含义是根据m划分n的方法数 比如说m=n=4 那么就是对4根据4进行整数划分
- 再比如n=4,m=3 ,那么就是根据m=3来划分n=4 n=3+1=2+1+1=1+1+1+1 一共三种
过程
- q(n, m)表示,n这个整数被划分,其中最大可能整数是m的所有划分情况数目。明显,所求,即为q(n,n)
- 当m>n时,明显有 q(n, m) = q(n, n)。因为,保证了所有整数都必须是大于等于1的。所以,限制再高的上限都没有任何的意义。
- 当m=n时候,明显有两种划分,第一种就是全部拿走,另一种就是不全部拿走,那最大可能即为n-1。即,q(n,n) = 1+q(n, n-1)。
- 当m<n时候,同之前的方法类似。要么是不拿走当前最大值的可能,要么就是拿走最大值的。即,q(n, m) = q(n, m-1) + q(n-m, m)
python实现
def q(n,m):
if n==0 or m==0:#无意义
return 0
if n==1 or m==1:#其中一个为1
return 1
if n==m:#相同的时候
return q(n,m-1)+1
if n<m:
return q(n,n)
return q(n,m-1)+q(n-m,m)
结果