指把一个
正整数n写成多个大于等于1且小于等于其本身的整数的和,则其中各加数所构成的集合为n的一个划分。这是一个典型的递归算法。
所谓整数划分,是指把一个正整数n写成为
其中,
为正整数,并且
;
为n的一个划分。
如果
中的最大值不超过m,即
,则称它属于n的一个m划分。
这里我们记n的m划分的个数为
。
例如,当n=4时,有5个划分,即
,
,
,
,
。
注意:
和
被认为是同一个划分。
根据n和m的关系,考虑一下几种情况:
(一)当
时,无论m的值为多少
,只有一种划分,即
。
(二)当
时,无论n的值为多少,只有一种划分,即n个1,
。
(三)当
时,根据划分中是否包含n,可以分为以下两种情况:
(1)划分中包含n的情况,只有一个,即
。
(2)划分中不包含n的情况,这时划分中最大的数字也一定比n小,即n的所有
划分。
因此
。
(四)当
时,由于划分中不可能出现负数,因此就相当于
。
(五)当
时,根据划分中是否包含最大值m,可以分为以下两种情况:
(1)划分中包含m的情况,即
,其中
的和为n-m,因此这种情况下为
。
(2)划分中不包含m的情况,则划分中所有值都比m小,即n的
划分,个数为
。
因此
。
C语言实现
#include<stdio.h>
void
main()
{
int
equation(
int
n,
int
m);
int
n,m;
printf
(
"Please input 'n'(0<n<100):"
);
scanf
(
"%d"
,&n);
printf
(
"Please input 'm'(0<m<=n):"
);
scanf
(
"%d"
,&m);
printf
(
"quantity:%d\n"
,equation(n,m));
}
int
equation(
int
n,
int
m)
{
if
(n==1||m==1)
return
(1);
else
if
(n<m)
return
equation(n,n);
else
if
(n==m)
return
1+equation(n,n-1);
else
return
equation(n-m,m)+equation(n,m-1);
}