(递归经典问题)整数划分问题

问题描述:将正整数n表示成一系列正整数之和:n=n1+n2++nk

其中n1≥n2≥nk≥1k≥1

正整数n的这种表示称为正整数n的划分。求正整数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

分析:设置函数q(n,m),n代表输入的整数,m代表最大加数不能超过这个数

          可以分成以下几种情况:①q(n,1) = 1,最大加数不能超过1,只有这一种情况

                                                  ②q(n,m) = q(n,n) (m≥n),这种情况对应着:我最大加数不能超出m但是我输入的整数最大只能到n,所以相当于q(n,n)

③q(n,n) = q(n,n-1)+1(比如q(6,6),当最大加数为6时只有6=6一种情况,也就是相当于我用递归思想得到前面的再加1就可以得到)

④这应当是最难于理解的一种情况:

               q(n,m)=q(n,m-1)+q(n-m,m),n>m>1;

              正整数n的最大加数n1不大于m的划分由n1=m的划分和 n1≤n-1 的划分组成。

              比如题目对q(6,5)的划分情况,

              可以分解成q(6,3)的所有情况加上q(n-m,m)的情况,这个时候m已经不是主要的问题了,只需要求出n-m种划分情况,也就是对应着6 = 5+1的情况

 
#include<stdio.h>
int q(int n,int m);
int q(int n,int m){
	if(m==1||n==1){
		return 1;
	}
	if(n<m){
		return q(n,n);
	}else if(n>m){
		return q(n,m-1)+q(n-m,m);
	}else{
		return q(n,n-1)+1;
	}
}
int main(){
	int n,m;
	while(scanf("%d",&n)!=EOF){
		printf("%d\n",q(n,n));
	}
	return 0;
}

 

         

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值