递归中的整数划分问题

递归中的整数划分问题


问题描述

整数划分是算法中的一个经典问题,可以使用递归知识进行求解。所谓整数划分,是指把一个正整数n写成如下形式:n=m1+m2+…+mi; (其中mi为正整数,并且1 <= mi <= n),则{m1,m2,…,mi}为n的一个划分。
如果{m1,m2,…,mi}中的最大值不超过m,即max(m1,m2,…,mi)<=m,则称它属于n的一个m划分。这里我们记n的m划分的个数为q(n,m);

一、递归思路

由题意可知为求q(n,m)(意为n的m规划的个数)。但是我们并不能确定出n和m具体的值,于是这里需要进行对n与m关系的分类讨论。

开始情况讨论
1.若n = 1,即为求q(1,m),不论m取多少(m>0),都只有一种划分就是{1}。
2.若m = 1,即为求q(n,1),亦为将n进行整数划分,但是每个整数的最大值均不超过1,显然只有一种划分即为{1,1,1,…,1}(n个1)。
3.若n = m,由于规划中是否含有n,必须还要向下进行划分,可以分为两种情况:
(1).划分中包含有n了,那么必然只能是{n}这种分法。
(2).若划分中不包含有n,那么划分包含的数中最大的数一定比n要小(不然的话与(1)就冲突了),最大数可以为n-1,故为n的所有n-1划分q(n,n-1)。
综合(1)(2),因此有q(n,n) = 1 + q(n,n-1)
4.当n<m时,由于划分中不允许负数的出现,纵使m多么大在n的划分中也不可能出现m,于是此时q(n,m) = q(n,n)。
5.当n > m时,根据n的划分中是否包含m又可以进行分类讨论
(1).当划分中包含m情况
在这里插入图片描述
(2).当划分中不包含m的情况
在这里插入图片描述
综合(1)(2)有,q(n,m) = q(n-m,m) + q(n,m-1);

经过上述的推导,不难由递归关系式发现出其中的递归规律。我们只需要按部就班编码即可。

二、代码实现

#include <iostream>
using namespace std;
int F(int n,int m)
{
    if(n<1 || m<1)
        return 0;
    if(n == 1 || m == 1)
        return 1;
    if(n < m)
        return F(n,n);
    if(n == m)
        return 1+F(n,n-1);
    return F(n,m-1)+F(n-m,m);   //什么特殊情况都没发生
}
int main ()
{
    int x,y;
    cin >> x >>y;
    printf("%d",F(x,y));
    return 0;
}



  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值