整數數的劃分問題:就是把一個整數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


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



31

32

33

34



35

36

37

38



39

40

41

42

43

44

45

46

47

48

49
