整数数的划分问题:就是把一个整数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