【算法】 递归求解整数划分

描述

将正整数n表示成一系列正整数之和:n=n1+n2+…+nk, 其中n1≥n2≥…≥nk≥1,k≥1。 正整数n的这种表示称为正整数n的划分。求正整数n的不 同划分个数。 

例如正整数6有如下11种不同的划分: 
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。 


分析:

数字 6 的划分可以看成 最大值为 6 的划分 + 最大值为 5 的划分 + ... + 最大值为 1 的划分

当数值为 1 时,或者 最大值为 1 时 返回 1 。

分类如下:

规定 数字为 a , 最大值为 b;

当 a == 1 ||  b == 1 return 1;

当 a > b return a,b-1 的划分 + a-b,b 的划分

当 a < b return a,a 的划分

当 a == b return a a-1 的划分 + 1

<span style="font-size:18px;">#include <stdlib.h>

#define RUN_COUNT    10
#define NUM_MAX          10

int run_test(int nNum);
int f(int a,int b);

int main(void)
{
    int nNum = 0;
    int i = 0;

    for (i = 0; i < RUN_COUNT; i++)
    {
       nNum = rand() % NUM_MAX + 1;
       printf("The number of integer %d division method is %d\n", nNum, run_test(nNum));
    }
    return 0;
}

int run_test(int nNum)
{
	return f(nNum,nNum);
}

// a 记录剩余数  b 记录现用最大数
// 算法思想: 递推表达式如下:
// 整数 a 的一个 b 划分 b 为该划分的最大值
int f(int a,int b)
{
	if (a == 1 || b == 1)
		return 1;
	if (a == b)
		return f(a,b-1)+1;
	if (a > b)
		return f (a,b-1)+f(a-b,b);
	if (a < b)
		return f(a,a);

	return 0;
}
</span>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值