整数划分问题
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;
}
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;
}