整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及。所谓整数划分,是指把一个正整数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划分的个数为f(n,m);

例如但n=4时,他有5个划分,{4},{3,1},{2,2},{2,1,1},{1,1,1,1};

注意4=1+3 和 4=3+1被认为是同一个划分。

该问题是求出n的所有划分个数,即f(n, n)。下面我们考虑求f(n,m)的方法;

1.递归法:

根据n和m的关系,考虑以下几种情况:

(1)当n=1时,不论m的值为多少(m>0),只有一种划分即{1};

(2)当m=1时,不论n的值为多少,只有一种划分即n个1,{1,1,1,...,1};

(3)当n=m时,根据划分中是否包含n,可以分为两种情况:

(a)划分中包含n的情况,只有一个即{n};

(b)划分中不包含n的情况,这时划分中最大的数字也一定比n小,即n的所有(n-1)划分。

因此 f(n,n) =1 + f(n,n-1);

(4)当n<m时,由于划分中不可能出现负数,因此就相当于f(n,n);

(5)但n>m时,根据划分中是否包含最大值m,可以分为两种情况:

(a)划分中包含m的情况,即{m, {x1,x2,...xi}}, 其中{x1,x2,... xi} 的和为n-m,因此这情况下

为f(n-m,m)

(b)划分中不包含m的情况,则划分中所有值都比m小,即n的(m-1)划分,个数为f(n,m-1);

因此 f(n, m) = f(n-m, m)+f(n,m-1);

综上所述:

f(n, m)=   1;              (n=1 or m=1)

f(n,m)   =    f(n, n);                   (n<m)

1+ f(n, m-1);              (n=m)

f(n-m,m)+f(n,m-1);         (n>m)

#include<iostream>
using namespace std;int equationCount(int n,int m)
{if(n==1||m==1)return 1;else if(n<m)return equationCount(n,n);else if(n==m)return 1+equationCount(n,n-1);elsereturn equationCount(n,m-1)+equationCount(n-m,m);
}int main(void)
{int n;while(scanf("%d",&n)!=EOF&&(n>=1&&n<=120)){printf("%d\n",equationCount(n,n));}return 0;
}

整数划分问题(递归法)相关推荐

  1. (C语言)整数划分问题 递归和递推

    题目内容: 对于一个正整数n的划分,就是把n变成一系列正整数之和的表达式.注意,分划与顺序无关,例如6=5+1跟6=1+5是 同一种分划.另外,单独这个整数本身也算一种分划. 例如:对于正整数n=5, ...

  2. 整数划分问题 递归 动态规划 openjudge 百练 python

    4117:简单的整数划分问题 http://bailian.openjudge.cn/practice/4117 4119:复杂的整数划分问题 http://bailian.openjudge.cn/ ...

  3. 用汉语法读 -2^31 ~ 2^31-1 范围内的一个整数 (递归法)

    #include <iostream> using namespace std; const char Cname[10][3] = {"", "一" ...

  4. java整数划分递归_整数划分问题(递归法)

    整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及.所谓整数划分,是指把一个正整数n写成如下形式: n=m1+m2+...+mi; (其中mi为正整数,并且1 < ...

  5. 整数划分问题(续)(非递归法)

    上一篇讨论的是整数划分问题递归方法,下面来讨论下非递归方法: 一般情况下,遇到递归问题,若能直接求得递推式,则可以很容易用数组模拟来实现递归,根据已经得出的递归关系,可以设置一个二维数组S[][]来存 ...

  6. 递归法:整数划分问题(怎么进行划分呢)

    问题:整数划分问题 例如,正整数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+ ...

  7. 递归--整数划分问题

    问题描述: 将正整数n表示成一系列正整数之和:n=n1+n2+-+nk,其中n1≥n2≥-≥nk≥1,k≥1.正整数n的这种表示称为正整数n的划分. 问题1: 输出整数n的所有可能的划分,如: 输入: ...

  8. 整数划分问题(路径输出)【递归求解方式】

    简述 具体的算法解释可以参照下面链接,非常详细~ 整数划分问题[递归以及递推求解方式] 代码 #include <iostream> using namespace std; #inclu ...

  9. 整数划分问题【递归以及递推求解方式】

    简述 用一系列正整数之和来表示一个整数,称之为整数划分.而整数划分问题则对于某个数字,输出对应整数划分的数量. 先写递归,有了递归之后,就换用递推来加快速度. 算法思路 q(n, m)表示,n这个整数 ...

最新文章

  1. SOTA排行榜大变天!MIT研究十个CV测试集,平均错误率超3.4%
  2. 求数组中奇数偶数的个数
  3. java 压缩文件tar_使用Java API进行tar.gz文件及文件夹压缩解压缩
  4. seata-golang 接入指南
  5. 服务器会自动创建cookie,网站的cookie机制是什么
  6. 砸了140亿的计算机视觉,未来到底如何?
  7. 兄弟连区块链教程Fabric1.0源代码分析configupdate处理通道配置更新
  8. appium 设置参数
  9. Android 柱状图(自定义View)
  10. [7]对话框控件的变量绑定
  11. (第一周)2018091-2 博客作业
  12. AMP+EPP3.0的开发环境配置
  13. 一个Android沉浸式状态栏上的黑科技
  14. 华为智选 720 全效空气净化器 评测
  15. 新元宇宙每周连载《地球人奇游天球记》第十三回火星烧烤
  16. 服务器系统显示白屏,服务器远程显示白屏
  17. 古代日本人没有姓,只有名
  18. 【博客344】简述微服务新利剑:Istio
  19. HC-05 蓝牙模块使用
  20. 文本分类算法TextCNN原理详解

热门文章

  1. java在哪个文件夹_JVM具体在哪个文件夹下的
  2. python计算均方根误差_如何在Python中创建线性回归机器学习模型?「入门篇」
  3. Webpack vs Rollup
  4. vue-music(1)音乐播发器 项目开发记录
  5. SOFA 源码分析 — 链路数据透传
  6. [译]yield关键字都做了什么?
  7. WebService中使用自定义类的解决方法(5种)
  8. 用系统某一用户的的身份运行某一命令
  9. 读取 XML 数据时,超出最大字符串内容长度配额 (8192)
  10. 微软“SharePoint天天向上”第一期线上活动