(C语言)整数划分问题 递归和递推
题目内容:
对于一个正整数n的划分,就是把n变成一系列正整数之和的表达式。注意,分划与顺序无关,例如6=5+1跟6=1+5是
同一种分划。另外,单独这个整数本身也算一种分划。
例如:对于正整数n=5,可以划分为:
1+1+1+1+1
1+1+1+2
1+1+3
1+2+2
2+3
1+4
5
输入一个正整数n
输出n整数划分的总数k
5
7
1、问题描述和分析
对于一个正整数n的分化,就是把n表示成一系列正整数之和的表达式。注意,分划与顺序无关,例如6=1+5 和 6=5+1被认为是同一个划分。另外,这个整数n本身也算是一种分化。
分析:
所谓整数划分,是指把一个正整数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};
2、数据结构和算法
该问题是求出n的所有划分个数,即f(n, n)。下面我们考虑求f(n,m)的方法,采用递归法, 根据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 Divinteger(int n,int m) {if(n == 1||m == 1)return 1;else if(n < m)return Divintege(n,n);else if(n == m)return 1+Divintege(n,n-1);elsereturn Divintege(n,m-1) + Divintege(n-m,m);
}int main(void) {int n;while(scanf("%d",&n) != EOF && (n >= 1)) {printf("%d\n",Divintege(n,n));}return 0;
}
递推公式:
递推就是打表,通过矩阵存下所有的个数,公式和思路与上面的一致,只需要把下面代码中的 i 看成 n ,j 看成 m,然后初始化 i = 0时候所有的值,
递推代码:
#include<stdio.h> int resolve(int a,int max)
{ if(a == 1||max ==1) return 1; if(a == max) return resolve(a,max-1)+1; if(a > max) return resolve(a,max-1)+resolve(a-max,max); if(a < max) return resolve(a,a); else return 0;
} int main()
{ int n; int sum; scanf("%d",&n); sum = resolve(n,n); printf("%d",sum); return 0;
}
(C语言)整数划分问题 递归和递推相关推荐
- c语言中用递推法解决渔夫问题,递归、递推 - IT小冰的个人空间 - OSCHINA - 中文开源技术交流社区...
递归 定义 :定义一个函数时出现调用本函数的成分,称之为递归 直接递归,自己调自己 间接递归,函数p调函数q,q又调用p 尾递归,递归函数中,递归调用语句是最后一句 递归应满足的条件 : 需要解决的问 ...
- 贪心、递归、递推以及动态规划算法的分析与对比
PS: 头一次规规矩矩的按照论文的格式写文章,呵呵.虽然是小儿科的不能再小儿科的东西了..不过..也忽悠了6000多字~~嘿嘿..肯定写的不好,第一次嘛..所以..接受大家一切批评哈!...文章N ...
- 递归与递推 普通排队问题及带约束条件的排队问题 c代码
先看下题目: 电影院买票排队,票价50,排队的人中携带50元的有20个人,携带100的有10个人,售票处开始时没有余额, 问最多有多少种排队方式使得售票处能够找的开(携带相同数额的人交换位置算一种排队 ...
- 【递归与递推】诸侯安置
[递归与递推]诸侯安置 题目描述 很久以前,有一个强大的帝国,它的国土成正方形状,如图2-2所示. 这个国家有若干诸侯.由于这些诸侯都曾立下赫赫战功,国王准备给他们每人一块封地(正方形中的一格).但是 ...
- 递归与递推 输出斐波拉契数列的前n项 python
输出斐波拉契数列的前n项 python 递归与递推 文章目录 输出斐波拉契数列的前n项 python 题设 题解 题设 以下数列 0 1 1 2 3 5 8 13 21 - 被称为斐波纳契数列. 这个 ...
- 【算法反刍】递归与递推
对于递归和递推的非常专业的定义和解释在这里就不再copy了,私以为算法的关键是运用和实践,就好比围棋,规则简单但是入门的门槛很高,就算熟练记忆规则也没法下好一盘棋.Likewise,对于算法学习,最关 ...
- 斐波那契尾递归函数java_斐波那契数列 递归 尾递归 递推 C++实现
==================================声明================================== 本文原创,转载请注明作者和出处,并保证文章的完整性(包括本 ...
- 2.3 基本算法之递归变递推 1188 菲波那契数列(2) python
http://noi.openjudge.cn/ch0203/1760/ """2.3 基本算法之递归变递推 1188 菲波那契数列(2)--3分 http://ybt. ...
- 2.3基本算法之递归变递推 1188 菲波那契数列(2)
http://noi.openjudge.cn/ch0203/1760/ /* 2.3基本算法之递归变递推 1188 菲波那契数列(2) http://ybt.ssoier.cn:8088/probl ...
最新文章
- android调试——教你用dumpsys命令调试
- html+not选择器,CSS3属性选择器与(:not)选择器_html/css_WEB-ITnose
- 1371. Find the Longest Substring Containing Vowels in Even Counts
- 今天学会了如何察看SSDT里面的东西、修改里面的地址
- 《途客圈创业记:不疯魔,不成活》一一1.6 申请助跑计划
- WPF 右下角弹窗的简单实现
- 我妈要把闺蜜介绍给我当女朋友......
- [memory]虚拟地址空间分布
- UI设计师如何正确打开暗黑模式|实用素材拿走
- 如何禁用Web表单字段/输入标签上的浏览器自动完成功能?
- MySQL 基础 —— 数据类型、各种变量
- MMKV_MMKV—强大的存储工具
- c++实现 龙格库塔经典4阶算法
- C++模拟手机通信录管理系统
- ElasticSearch六 ElasticSearch扩展之FileBeat、Logstash
- 树支路总数 = 树节点总数 - 1
- 手写简易java消息队列
- 192.168.8.1手机登陆_192.168.8.1登录入口上网设置
- 玩吃鸡台式计算机配置,玩吃鸡的电脑配置推荐_玩吃鸡的电脑配置最低要多少...
- HDU-3635 Dragon Balls
热门文章
- Java正则表达式——验证手机号码符合性
- Ubuntu18.04——正确安装英伟达(NVIDIA)显卡驱动的一种简便方法
- 深度系统linux15.3 32位下载,deepin 15.3|deepin linux 15.3下载|linux deepin 2016下载-游迅网...
- 【安卓软件】KMPlayer-一款完美的媒体播放器 可以播放所有格式的字幕和视频
- comsol三维多孔结构 泡沫材料 孔隙介质模型
- 云安全实现高效预防 未来之路怎么走?
- VMware虚拟机与主机之间文件共享配置
- Elasticsearch suggest
- Java笔试题:顺时针方向输出n*m的矩阵
- 物流英语与计算机操作,物流英语与计算机模拟题及正确答案[精选].doc