整数划分问题
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
将正整数
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