您的位置:首页 > 其它

整数划分问题

2009-06-10 13:37 260 查看
整数划分问题

将正整数
n
表示成一系列正整数之和,
n=n1+n2+…+nk,
其中
n1>=n2>=…>=nk>=1

k>=1


正整数
n
的这种表示称为正整数
n
的划分。正整数
n
的不同的划分个数称为正整数
n
的划分数,记作
p(n)


例如正整数
6
有如下
11
种不同的划分,所以
p(6)=11


6;

5+1;

4+2,4+1+1;

3+3,3+2+1,3+1+1+1;

2+2+2,2+2+1+1,2+1+1+1+1;

1+1+1+1+1+1.

在正整数
n
所有不同的划分中,将最大加数
n1
不大于
m
的划分个数记作
q(n,m)
,称它为属于
n
的一个
m
划分。根据
n

m
的关系,考虑以下几种情况:


1
)当
n=1
时,不论
m
的值为多少(
m>0)
,只有一种划分即
{1};

(2)

m=1
时,不论
n
的值为多少,只有一种划分即
n

1

{1,1,1,...,1};

(3)

n=m
时,根据划分中是否包含
n
,可以分为两种情况:

(a).
划分中包含
n
的情况,只有一个即
{n}


(b).
划分中不包含
n
的情况,这时划分中最大的数字也一定比
n
小,即
n
的所有
(n-1)
划分。

因此
q(n,n) =1 +
q(n,n-1);

(4)

n<m
时,由于划分中不可能出现负数,因此就相当于
q(n,n);

(5)

n>m
时,根据划分中是否包含最大值
m
,可以分为两种情况:

(a).
划分中包含
m
的情况,即
{m, {x1,x2,...xi}},
其中
{x1,x2,... xi}
的和为
n-m
,可能再次出现
m
,因此是(
n-m
)的
m
划分,因此这种划分个数为
q(n-m, m);

(b).
划分中不包含
m
的情况,则划分中所有值都比
m
小,即
n

(m-1)
划分,个数为
q(n,m-1);

因此
q(n, m) = q(n-m,
m)+q(n,m-1);

综合以上情况,我们可以看出,上面的结论具有递归定义特征,其中(
1
)和(
2
)属于边界条件,(
3
)和(
4
)属于特殊情况,将会转换为情况(
5
)。而情况

5
)为通用情况,属于递推的方法,其本质主要是通过减小
m
以达到边界条件,从而解决问题。其递推表达式如下:

0
n<1

m<1

1
n=1

m=1

q(n,m)
=
q(n,n)
n<m

1+q(n,n-1)
n=m

q(n,m-1)+q(n-m,m)
n>m>1

据此,可设计计算
q(n,m)
的递归算法如下。其中,正整数
n
的划分数
P(n)=q(n,n)


int Part(int n, int m)

{

if ((n < 1)||(m < 1))

return 0;

if ((n == 1)||(m == 1))

return 1;

if (n < m)

return Part(n, n);

if (n == m)

return Part(n, m-1) + 1;

return Part(n, m-1) + Part(n-m, m);

}

参考文献:


整数划分问题


hoodlum1980 (
發發
)
的技术博客
http://www.cnblogs.com/hoodlum1980/archive/2008/10/11/1308493.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: