整数划分
将正整数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); }