整数划分

本文介绍了一种计算正整数不同划分方式数量的算法,并通过递归关系实现了具体的功能。文章给出了递归公式及其解释,并提供了一个C++实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将正整数n表示成一系列正整数之和:n=n1+n2+...+nk, 其中n1>=n2>=....>=nk>=1, k >=1

求正整数n的不同划分个数。

 

例如正整数6有如下11中不同的划分:

6

5+1

4+24+1+1

3+33+2+13+1+1+1

2+2+22+2+1+12+1+1+1+1

1+1+1+1+1+1

如果设P(n)为正整数n的划分数,则对于找到递归关系是很困难,我们不妨引入这样一个变量:将n最大加数不大于m的划分个数记做q(n,m)

那么,我们就可以建立如下的递归关系

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

当最大加数ni不大于1的时候,任何正整数n只有一种划分形式,即n = 1+1+1+....+1

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

最大加数ni实际上是不能大于n的。如q(1, m) = 1

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

正整数n的划分可以有ni = n的划分和ni <= n-1的划分组成

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

正整数n的最大加数ni不大于m的划分由:

ni <= m-1的划分(全部划分< m)和ni = m的划分组成。

q(n-m, m):即去掉一个mn-m的可能划分数



#include<iostream>
using namespace std;

int fun(int n, int m)
{
	if(n == 1 || m == 1)
		return 1;
	else if(n < m)
		return fun(n, n);
	else if(n == m)
		return fun(n, m-1) + 1;
	else
		return fun(n, m-1) + fun(n-m, m);
}

int main()
{
	int n;
	cin>>n;
	cout<<fun(n, n)<<endl;

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值