整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及。所谓整数划分,是指把一个正整数n写成如下形式:
n=m1+m2+...+mi; (其中mi为正整数,并且1 <= mi <= n),则{m1,m2,...,mi}为n的一个划分。
如果{m1,m2,...,mi}中的最大值不超过m,即max(m1,m2,...,mi)<=m,则称它属于n的一个m划分。这里我们记n的m划分的个数为f(n,m);
例如但n=4时,他有5个划分,{4},{3,1},{2,2},{2,1,1},{1,1,1,1};
注意4=1+3 和 4=3+1被认为是同一个划分。
#include <iostream>
using namespace std;
int mark[256];//用来记录相加数字
int n,all;//all记录公式总数
void tongji(int sum, int deepth, int max)
{
if (sum==n)//累加的总数sum增加和n相等时
{
cout<<mark[0];//输出头号数字
for (int i=1; i<deepth;i++)
{
cout<<"+"<<mark[i];//输出相加的公式
}
cout<<endl;
all++;//公式总数加一
}
else if(sum<n)
{
for (int i=max; i > 0; i--)
{
mark[deepth] = i;
tongji(sum+i,deepth+1,i);//累加的总数sum增加,相加数字数量deepth加一
}
}
}
int main()
{
while (cin >> n)
{
cout<<"正整数"<<n<<"有如下不同的划分"<<endl;
all = 0;
tongji(0, 0, n);
cout<<"一共有"<<all<<"种不同的划分"<<endl;
cout<<"-----------------------------------------"<<endl;
}
}
输入
6
输出
正整数6有如下不同的划分
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
一共有11种不同的划分