问题:将给定正整数n表示成一系列正整数之和 n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1。 求正整数n的不同划分个数p(n)。
有些问题本身都具有比较明显的递归关系,因而容易用递归函数直接求解。 而有些问题递归关系却不明显。 在本例中,如果设p(n)为正整数n的划分数,则难以找到递归关系,因此考虑 增加一个自变量:将最大加数n1不大于m的划分个数记作q(n,m)。
代码如下:
#include <iostream>
using namespace std;
//划分
int Intdivision(int n, int m)
{
if (n < 1 || m < 1)
return 0;
else if (n == 1 || m == 1)
return 1;
else if (n < m)
return Intdivision(n, n);
else if (n == m)
return Intdivision(n, m - 1) + 1;
else
return Intdivision(n, m - 1) + Intdivision(n - m, m);
}
int main()
{
int n;
cout << "请输入要划分的整数:";
cin >> n;
int count = Intdivision(n, n);//统计数目
cout << "这个数有 " << count << " 种划分" << endl;
return 0;
}
解决本题此处主要用的是分治法,将特殊情况都考虑到,从而一步步解决,但此方法存在重复计算的问题,故而还有待改进。