将正整数n表示为一系列正整数之和,

     n=n1+n2+n3+n4+......+nk   (其中,n1>=n2>=n3>=n4........>=nk>0,k>=1)

正整数n的这种表示成为正整数n的划分。正整数n的不同划分个数成为正整数n的划分数,记作p(n)。

例如,正整数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。例如,对6的划分可以认作是将6划分为加数小于等于6的划分,因为6的加数确实小于等于6,为什么要引入这个m呢,是因为我们发现,从这个角度思考,比较容易求解。我们将划分的种类数记为q(n,m)

在递归里,要对形参进行判断

(1)当n=1时 q(1,m):表示是对1的划分,那么只有一种划分方式 1

(2)当m=1时q(n,1):当m=1时其实就是把让所有加数小于等于1,那就是所有加数都是1咯(不考虑负数),当然也只有一种划分方式

(3)当n==m时q(n,n):此时就是对n的划分出来的数没有限制,默认限制就是不大于n,此时划分的总类数要分两种情况才比较好解决:

       1.划分出来的数包含n(或m,因为n==m):那只有一种方式 比如 6的划分 只有 6;一种方式2.划分出来的数不包含n(或m,因为n==m):就可以认为是将6划分出来的数都小于6,其实就是都小于或等于5,接下来        其实就是求出来q(n,n-1)或者是q(n,m-1),此时n>m-1,放到递归方程里就是求解q(n,m) n>m综合起来 q(n,n)=1+q(n,m-1)

(4)当n>m时:当遇到这个问题时,其实可以看做是对n的划分有了条件,就是所有的划分出来的数小于m,在上文中,6有11种划分方式,那是没有对6划分出来的数进行限制,当要使划分出来的数都小于某个数时比如5时,那就不是11种了。

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;

这个时候分两种情况:包含m和不包含m :

不包含m就是:

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;这些情况,其实就是求6的划分出来的数小于等于4的情况,放到递归方程就是 q(n,m-1)

包含m就是:

5+1;

这个时候,确定这种划分数量的时候m不再是主角,我们只要求出来n-m的划分情况就行了,因为此时的m的划分情况,取决于n-m。 比如包含m=5的划分情况就是 6-5=1的情况,比如包含4的划分情况就是求6-4=2,2的没有限制的划分情况。放到递归方程里面就是q(n-m,m)

(5)q(n,m)n<m:n<m时,比如n=6,m=7 求得就是6得划分数小于等于7的情况,其实就是求解小于等于6,故此时情况就是求解q(n,n);

根据以上分析:

q( n, n ) = 1, 当 n ==1;

q( n, n ) = 1, 当m == 1;

q( n, n ) = q( n,n ) , 当n < m;

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

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

#include<iostream>
using namespace std;
int q(int n,int m)
{if((n<0)||(m<0))return 0;if((n==1)||(m==1))return 1;if(n<m)return q(n,n);if(n==m)return (1+q(n,m-1));if(1<m<n)return q(n,m-1)+q(n-m,m);
}
int main()
{int n;cout<<"输入需要来解决的整数划分问题的数字:"<<endl;cin>>n; cout<<n<<"的整数划分的个数一共有"<<q(n,n);return 0;}

算法设计与分析——分治与递归——整数划分问题相关推荐

  1. 算法设计与分析——分治与递归策略——hanoi问题

    **汉诺塔问题:**古代有一个梵塔,塔内有三个座A.B.C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图).有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移 ...

  2. 算法设计与分析----二分搜索(递归)

    二分搜索有很多写法,在算法分析与设计中,二分搜索是在递归分治这一章讲到的,所以用递归实现一下. 二分搜索其实很容易理解,设想一根从北京到上海的电线坏掉了,但是不知道是从哪里坏的,要怎样才能使用最少的步 ...

  3. 算法设计与分析——递归与分治策略——全排列

    算法设计与分析--递归与分治策略--全排列 全排列问题的解决是通过分治与递归思想来解决的 首先判断是否递归到了最后一位,如果递归到了最后一位,则输出他当前的全排列序列. 如果没有到达最后一位,则循环的 ...

  4. 循环赛日程表非递归Java_王晓东《算法设计与分析》课件.ppt

    <王晓东<算法设计与分析>课件.ppt>由会员分享,可在线阅读,更多相关<王晓东<算法设计与分析>课件.ppt(356页珍藏版)>请在人人文库网上搜索. ...

  5. 【算法设计与分析】16 分治策略:快速排序(快速排序的时间复杂度计算)

    上一篇文章学习了:[算法设计与分析]15 分治策略:芯片测试 文章目录 1. 快速排序的基本思想 1.2 时间复杂度的计算 1.21 最坏情况时间复杂度计算 1.22 最好情况时间复杂度 1.23 平 ...

  6. 【算法设计与分析】15 分治策略:芯片测试

    上一篇文章学习了[算法设计与分析]14 分治算法的一般描述和分析方法 文章目录 1. 芯片测试 1.1 一次测试的过程 1.2 如何测试一块芯片的好坏 1.3 蛮力算法 1.4 分治算法设计思想 1. ...

  7. 【算法设计与分析】14 分治算法的一般描述和分析方法

    本文主要描述分治算法的一般描述和分析方法.衔接上一篇文章:[算法设计与分析]13 分治策略的设计思想 文章目录 1 分治算法的一般性描述 1.1 分支算法的时间分析 1.2 两类常见的递推方程与求解方 ...

  8. 算法设计与分析:分治思想 - 入门

    文章目录 分治思想 判断分治的条件 分治思想在排序问题的应用 求逆序对的个数 分治总结 本文参考UCAS卜东波老师的计算机算法设计与分析课程完成 分治思想 分治思想可以归纳为两点: 将一个复杂问题化简 ...

  9. 算法设计与分析——全排列问题算法分析(递归调用分析图)

    (目前网上最易理解递归调用的分析过程--递归调用分析图) 全排列: 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况 ...

最新文章

  1. mysql管理节点_mysql8 参考手册-NDB群集管理节点配置参数
  2. fnv64 mysql,centos7安装搭建rabbitmq
  3. 面对百亿用户数据,日均亿次请求,携程应用架构如何涅槃?
  4. leetCode刷题第一天--求两数之和
  5. 数据库出现的bug原因以及解决方法
  6. V1-bug Alpha阶段项目展示
  7. c++的进制转换函数
  8. MySQL - 触发器
  9. 【世间万象】五甲万科董事长孙凯歌:五甲有红旗情节
  10. Python 数学建模算法与应用(持续更新)
  11. 前端vs图片 3 jpg、png、gif 图片老三样系统总结
  12. 哭了,谁还会心疼?累了,谁让我依靠?
  13. flink的java api_Flink 流处理API之二
  14. umi中使用plugin-initial-state插件(initialState)
  15. 数据中心服务器怎么设置信息点,数据中心服务器机柜内的信息点数
  16. 怎样合理地规划使用电脑硬盘
  17. 股票 K线图 蜡烛图
  18. 设数列{Xn}有界,又limYn=0,证明:limXnYn=0
  19. 菜鸟学汇编005 栈(Stack) 和 段寄存器SS、SP
  20. 两列模糊对比 oracle,excel 模糊比对两列数据并将比对结果显示出来 | excel表格两列数据模糊对比...

热门文章

  1. 前后端分离开发模式下后端质量的保证 —— 单元测试
  2. [转]白话阿里巴巴Java开发手册高级篇
  3. 【EPS精品教程】史上最牛EPS说明文档大全(23个PDF文档)
  4. C#正则表达式判断输入的是不是数字
  5. Android之用glide加载gif图片静态展示
  6. Eclipse运行项目报Could not find *.apk!解决办法
  7. Android之SwipeRefreshLayout
  8. java Ant build.xml
  9. 《假如编程是魔法之零基础看得懂的Python入门教程 》——(五)我的魔法竟然有了一丝逻辑
  10. 使其正序排序 打印一串数字_JavaScript计数排序算法