(遞歸經典問題)整數劃分問題

問題描述:將正整數n表示成一系列正整數之和:n=n1+n2++nk

其中n1≥n2≥nk≥1k≥1

正整數n的這種表示稱爲正整數n的劃分。求正整數n的不

同劃分個數。

 

例如正整數6有如下11種不同的劃分:

    6

    5+1

    4+24+1+1

    3+33+2+13+1+1+1

    2+2+22+2+1+12+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;
}

 

         

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章