整数划分

将正整数n表示成一系列正整数之和:n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1。

仔细读题分析后发现,这道题目和上楼梯累砖块极其的类似

用f(n,m)表示整数n划分出不大于m的数的方案数

很显然f(n,m)=1 (n=1;m=1)

当n=m的时候f(n,m)=f(n,m-1)+1;

对于其他的f(n,m)为已经求出的小于m的方案数f(n,m-1) 和从前求出过的包含m的方案数f(n-m,m);

即f(n,m)=f(n,m-1)+f(n-m,m);

下面是代码

int div(int n,int m)
{
    if (m<0||n<0) return 0;
    if (m==1&&n==1) return 1;
    if (m==n) return div(n,m-1)+1;
    return div(n,m-1)+div(n-m,m);
}