我是靠谱客的博主 昏睡蜜粉,最近开发中收集的这篇文章主要介绍【算法】 递归求解整数划分,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

描述

将正整数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 %dn", 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>

最后

以上就是昏睡蜜粉为你收集整理的【算法】 递归求解整数划分的全部内容,希望文章能够帮你解决【算法】 递归求解整数划分所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部