整数的划分

来源:互联网 发布:类似于百度云的软件 编辑:程序博客网 时间:2024/05/16 23:49

整数的划分

定义

所谓整数划分,是指把一个正整数n写成多个大于等于1且小于等于其本身的整数的和,则其中各加数所构成的集合为n的一个划分。

用数学语言定义如下:

一个正整数n可写成如下的形式:

n=m1+m2+...+mi

其中
mi1 mi n


m=max{ m1,m2,...,mi} 

我们称之为n的m划分

例如5 = 5

​ 5 = 4+1

​ 5 = 3+2

​ 5 = 2+2+1

​ 5 = 3+1+1

​ 5 =1+1+1+2

​ 5 = 1+1+1+1+1

可见5的整数划分有7个(注意3+2和2+3算一种)

计算原理

很显然计算整数划分要用到递归思想

不妨这里记为f(n,m)

1.当 m = 1 或者 n = 1时

​ 那么只有一种情况,那就是{1}或者{1,1,1,1,1…1}

2.当n

实例分析

我们以之前的n = 5,m = 5 举例

  • .按照3,f(5,5) = 1+f(5,4)
  • 按照4,f(5,4) = f(1,4) +f(5,3)
  • 按照1,f(1,4) = 1
  • 按照4,f(5,3) = f(2,3)+f(5,2)
  • 按照3,4和1 f(2,3) = f(2,2) = 1+f(2,1) = 2
  • 按照4和1 f(5,2) = f(3,2) +f(5,1) = f(1,2) +f(3,1) +f(5,1) = 3
  • 最后将计算的结果回代,得到最终答案为3+2+1+1 = 7

C++代码

#include<iostream>using namespace std;int f(int n,int m);  //求整数n的m划分 int main(void){    int n,m;    cout << "请输入两个数字n和m,计算n的m划分:";     cin >> n >> m;    cout << f(n,m);    return 0; } int f(int n,int m){    if(n == 1 || m == 1)        return 1;    if(m>n)        return f(n,n);    else if(n == m)        return 1+f(n,m-1);    else        return f(n-m,m) + f(n,m-1);} 

反思

从上述例子,我们可以知道,光是5的情况,就递归了好多次,可想而知到数据足够大时,递归的效率就很低很低了。

原创粉丝点击