问题描述:将正整数n表示成一系列正整数之和:n=n1+n2+…+nk,
其中n1≥n2≥…≥nk≥1,k≥1。
正整数n的这种表示称为正整数n的划分。求正整数n的不
同划分个数。
例如正整数6有如下11种不同的划分:
6;
5+1;
4+2,4+1+1;
3+3,3+2+1,3+1+1+1;
2+2+2,2+2+1+1,2+1+1+1+1;
1+1+1+1+1+1。
分析:设置函数q(n,m),n代表输入的整数,m代表最大加数不能超过这个数
可以分成以下几种情况:①q(n,1) = 1,最大加数不能超过1,只有这一种情况
②q(n,m) = q(n,n) (m≥n),这种情况对应着:我最大加数不能超出m但是我输入的整数最大只能到n,所以相当于q(n,n)
③q(n,n) = q(n,n-1)+1(比如q(6,6),当最大加数为6时只有6=6一种情况,也就是相当于我用递归思想得到前面的再加1就可以得到)
④这应当是最难于理解的一种情况:
q(n,m)=q(n,m-1)+q(n-m,m),n>m>1;
正整数n的最大加数n1不大于m的划分由n1=m的划分和 n1≤n-1 的划分组成。
比如题目对q(6,5)的划分情况,
可以分解成q(6,3)的所有情况加上q(n-m,m)的情况,这个时候m已经不是主要的问题了,只需要求出n-m种划分情况,也就是对应着6 = 5+1的情况
#include<stdio.h>
int q(int n,int m);
int q(int n,int m){
if(m==1||n==1){
return 1;
}
if(n<m){
return q(n,n);
}else if(n>m){
return q(n,m-1)+q(n-m,m);
}else{
return q(n,n-1)+1;
}
}
int main(){
int n,m;
while(scanf("%d",&n)!=EOF){
printf("%d\n",q(n,n));
}
return 0;
}