整數數的劃分問題:就是把一個整數n劃分成一系列整數的和。當n=6時: 6; 5+1, 4+1+1,4+2; 3+1+1+1,3+2+1,3+3; 2+1+1+1+1,2+2+1+1,2+2+2; 1+1+1+1+1+1+1; 觀察上面的列表,可以得出觀察結論:對于每一行的第一個數字,總比上一行的數字小,且這一行都小于上一行,也就是基于更小的劃分。所以我們可以想到遞歸,但是怎么樣設計這個遞歸呢?就從“每一行是一個新的劃分,縮小問題的規模。得出Q(n,m)是對n的不大于m的劃分。然后我們在討論這個Q(n,m)函數問題! 1.m>n時: 對于n,對它進行m劃分,那么相當于對它進行n劃分。也就是Q(n,m)=Q(n,n); 2.m=n時: 對于這種劃分可以分成一個更小的規模,分成不大于n-1的劃分和1,這個1就是對n的劃分,就是n。所以Q(n,m)=(n,n-1)+1; 3.n>m時: 劃分成兩個字部分,首先對它進行不大于m-1的劃分,也就是Q(n,m-1),然后對它進行m的劃分,但總的成為n-m啦(想一下為什么?惡哈哈),為:Q(n-m,m).所以總的個數為:Q(n,m)=Q(n,m-1)+Q(n-m,m); 情況討論完了,現在該設計遞歸出口了: 當n=1||m=1時:顯然是1中劃分。 接下來我們該寫代碼了,如下:
1 /**//* 2 Name: 整數的劃分 3 Copyright: Copyleft 4 Author: 5 Date: 21-09-08 19:48 6 Description: 7 */ 8 int main() 9  { 10 int n,m; 11 scanf("%d",&n); 12 m=divinteger(n,n); 13 printf("%d\n",m); 14 system("PAUSE"); 15 return 0; 16 } 17 18 int divinteger(int n,int m) 19  { 20 if(n<1||m<1) 21 { 22 printf("Error!\n"); 23 exit(1); 24 } 25 if(n==1||m==1) 26 { 27 return 1; 28 } 29 else if(m>n) 30 { 31 return divinteger(n,n); 32 } 33 else if(n==m) 34 { 35 return divinteger(n,m-1)+1; 36 } 37 else 38 { 39 return divinteger(n,m-1)+divinteger(n-m,m); 40 } 41 } 42 43 44 45 46 47 48 49
|
|
|
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
31 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
|
導航
統計
常用鏈接
留言簿(1)
隨筆分類(10)
隨筆檔案(10)
文章分類
好友的blog
牛人的biog
最新隨筆
搜索
最新評論

閱讀排行榜
評論排行榜
|
|