整数划分问题
将正整数
n表示成一系列正整数之和:n=n1+n2+…+nk,
其中
n1≥n2≥…≥nk≥1,k≥1。
正整数
n的这种表示称为正整数n的划分。求正整数n的不
同划分个数。
例如正整数
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。
前面的几个例子中,问题本身都具有比较明显的递归关系,因而容易用递归函数直接求解。
在本例中,如果设
p(n)为正整数n的划分数,则难以找到递归关系,因此考虑增加一个自变量:将最大加数n1不大于m的划分个数记作q(n,m)。可以建立q(n,m)的如下递归关系。
int q(int n,int m)
{
if(n<1)||(m<1) return 0;
//
if (n==1)||(m==1)) return 1;
//当最大加数不大于1时,任何正整数n只有一种划分形式,即n=1+1+…+1;
if(n<m) return q(n,n);
//最大加数不能大于n,故m>n时=q(n,n)
if(n==m) return (q(n,n-1)+1);
//正整数n的划分由n
1 =n的划分和n
1<=n-1的划分组成。
return q(n,m-1)+q(n-m,m);
//正整数n的最大加数不大于m的划分由n
1=m的划分和n
1<=m-1的划分组成。
}
这样只能得到可能分解的个数,如果要想得到每种分解的情况,就要另外设计算法了。