整数数的划分问题:就是把一个整数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*/ 8int 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 18int 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
|
|
|
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
27 | 28 | 29 | 30 | 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 |
|
导航
统计
常用链接
留言簿(1)
随笔分类(10)
随笔档案(10)
文章分类
好友的blog
牛人的biog
最新随笔
搜索
最新评论
阅读排行榜
评论排行榜
|
|