問題描述:將正整數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;
}