您的位置:首页 > 其它

整数划分问题

2013-03-17 22:30 190 查看
将一系列正整数表示成一系列正整数之和:

n = n1 + n2 + .... + nk

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

例如

正整数6有下面6种不同的划分,分别记为:

6 = 6

6 = 5 + 1

6 = 4+2, 4+1+1

6 = 3+3, 3+2+1,3+1+1+1

6 = 2+2+2,2+2+1+1, 2+1+1+1+1

6 = 1+1+1+1+1+1

其递归关系总结如下:

1) q ( n,1) = 1 ( n >= 1)

当最大加数不大于1时,任何正整数n只有一种划分: n = 1+1+1+...+1(n个)

2) q ( n,m) = q( n,n ) m>=n

最大加数实际上不能大于n,因此q(1,m) = 1

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

正整数n的划分由n1=n和n1<= n-1的划分组成

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

则算法

#include <iostream>

using namespace std;

int result( int n, int m)

{

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

{

return 0;

}

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

{

return 1;

}

if ( n < m )

{

return result(n,n);

}

if ( n == m )

{

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

}

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

}

int main(int argc, char const *argv[])

{

cout << result(6,6) << endl;

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: