整数划分问题

本文探讨了整数划分问题,这是一个在算法中经典的递归问题实例。内容详细介绍了如何将一个正整数n分解为若干个正整数的和,并给出了解决该问题的递归思路和公式。以7为例,展示了具体的划分情况,并提供了递归函数的代码实现。
摘要由CSDN通过智能技术生成

问题描述:
整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及。所谓整数划分,是指把一个正整数n写成如下形式:

n=m1+m2+...+mi; (其中mi为正整数,并且1 <= mi <= n),则{m1,m2,...,mi}为n的一个划分。

正整数6有如下11种不同的划分,所以P(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
思路:

由于只用一个参数不容易表示,用递归解决此问题时,我们采用了n,m两个参数。n表示要求的整数,m表示组成正整数n的最大整数n1的最大取值。对于每个正整数n,如果构成它的最大正整数n1=m,那么种类就应该等于f(n-m,m),如果n1<m,则应等于f(n,m-1).终上所述,f(n,m) = f(n-m,m)+f(n,m-1) ,n>m; 若是n == m,则f(n,m)=1+f(n,m-1); 若是n<m ,则f(n,m)=f(n,n) ; 若是n = 1或m = 1,则f(n,m) = 1;
具体表达式如下图所示:
在这里插入图片描述

以7为例:可做如下例子
在这里插入图片描述
运行结果:
在这里插入图片描述

递归函数:

void f(int n,int m)
{
 if(n==1 || m==1)
       return 1;
 else if(n<m)
       return f(n,n);
 else if(n==m)
      return f(n,m-1) + 1;
 else 
     return f(n,m-1)+f(n-m,m);
}
 

完整代码:

#include <iostream>
#include <bits/stdc++.h>
#include <string>

using namespace std;
//整数划分问题
int int_part(int n,int m)
{
     if(m==1)
        return 1;
     else if(n == 1)
        return 1;
     else if( n< m)
        return int_part(n,n);
     else if(n == m)
        return 1+int_part(n,m-1);
     else
        return int_part(n,m-1)+int_part(n-m,m);

}
int main()
{

    int n;
    cin>>n;
    cout<<int_part(n,n);
    return 0;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值