概述
描述
将正整数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>
最后
以上就是昏睡蜜粉为你收集整理的【算法】 递归求解整数划分的全部内容,希望文章能够帮你解决【算法】 递归求解整数划分所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复