整数划分问题

 

 整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及。所谓整数划分,是指把一个正整数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种不同的划分

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值