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

描述

将正整数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

#include 

#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;
}

你可能感兴趣的:(C语言,算法,C语言,动态规划,算法)