递归--整数划分问题
问题描述:
将正整数n表示成一系列正整数之和:n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1。正整数n的这种表示称为正整数n的划分。
问题1:
输出整数n的所有可能的划分,如:
输入: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。
我的思路:这种问题已经遇到过很多了,递归搜索所有可能的情况,同时为了记录下每一步的情况,那么就要用到一个数组mark来存储每一步的数,然后递归同时要传递递归的深度k。还有个问题就是递归下一个数的时候,因为是递减的排列的。所以我们还必须记录下上一个的数,然后下一个数必须小于或者等于上一个数。最后递归函数还有有个参数记录当前的长度,来判断是否能够组成我们想要的长度,不能的话就回溯,继续往下一个数去尝试。OK!
代码:
//整数划分问题
#include <stdio.h>
int mark[10];
int n;
void Divid(int now,int k,int prio)
{
//now记录当前长度,k记录深度,prio记录前一个的值。
int i;
if(now > n) return; //不合适,返回。
if(now == n)
{
for(i = 0; i < k-1; i++)
printf("%d+",mark[i]);
printf("%d\n",mark[i]);
}
else
{
for(i = prio; i > 0; i--)
{
if(i <= prio) //必须必前一个要小
{
mark[k]=i;
now+=i;
Divid(now,k+1,i);
now-=i;
}
}
}
}
int main()
{
scanf("%d",&n);
Divid(0,0,n-1);
return 0;
}
/5/29 14:17
问题2:求正整数n的不同划分个数,将最大数n1不大m的划分记住做q(n,m),叫做n的m划分。
输入:n m
输出:n的m划分的总个数。
我的思路:首先要找出递归的公式来,首先分析几种简单的情况,n==1||m==1可以直接得出结果为1;而当n<m时,可以直接求出q(n,n);当n=m时,因为对于n本身只有一种情况,即n,所有可以直接用1+q(n,n-1)来求。最后当n>m时,可以用q(n,m-1)+q(n-m,m),其中q(n-m,m表示的时当m固定后,求剩下可能的情况。参考下图:
代码:
//求整数划分的个数
#include <stdio.h>
int Divid(int n, int m)
{
if (n == 1 || m == 1) return 1; //必须是或
if (n < m) return Divid(n,n);
if (n == m) return 1 + Divid(n,n-1);
return Divid(n,m-1) + Divid(n-m,m);
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
printf("%d\n",Divid(n,m));
return 0;
}
/5/29 14:35
递归--整数划分问题相关推荐
- 算法设计与分析——分治与递归——整数划分问题
将正整数n表示为一系列正整数之和, n=n1+n2+n3+n4+......+nk (其中,n1>=n2>=n3>=n4........>=nk>0,k>=1) 正 ...
- 整数划分问题(续)(非递归法)
上一篇讨论的是整数划分问题递归方法,下面来讨论下非递归方法: 一般情况下,遇到递归问题,若能直接求得递推式,则可以很容易用数组模拟来实现递归,根据已经得出的递归关系,可以设置一个二维数组S[][]来存 ...
- 整数划分问题(递归法)
整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及.所谓整数划分,是指把一个正整数n写成如下形式: n=m1+m2+...+mi; (其中mi为正整数,并且1 < ...
- 整数划分问题(路径输出)【递归求解方式】
简述 具体的算法解释可以参照下面链接,非常详细~ 整数划分问题[递归以及递推求解方式] 代码 #include <iostream> using namespace std; #inclu ...
- 整数划分问题【递归以及递推求解方式】
简述 用一系列正整数之和来表示一个整数,称之为整数划分.而整数划分问题则对于某个数字,输出对应整数划分的数量. 先写递归,有了递归之后,就换用递推来加快速度. 算法思路 q(n, m)表示,n这个整数 ...
- Bailian4117 简单的整数划分问题【整数划分+记忆化递归】
4117:简单的整数划分问题 总时间限制: 100ms 内存限制: 65536kB 描述 将正整数n 表示成一系列正整数之和,n=n1+n2+-+nk, 其中n1>=n2>=->=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+ ...
- java整数划分递归_整数划分问题(递归法)
整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及.所谓整数划分,是指把一个正整数n写成如下形式: n=m1+m2+...+mi; (其中mi为正整数,并且1 < ...
- 整数划分问题 递归 动态规划 openjudge 百练 python
4117:简单的整数划分问题 http://bailian.openjudge.cn/practice/4117 4119:复杂的整数划分问题 http://bailian.openjudge.cn/ ...
最新文章
- SQL Server-聚焦什么时候用OPTION(COMPILE)呢?
- 人脸识别(二)——训练分类器的补充说明
- ASP.NET MVC中为DropDownListFor设置选中项的方法
- 文献记录(part90)--A novel density-based clustering algorithm using nearest neighbor graph
- vscode 遇到的迷之bug nvm is not compatible with the npm config prefix
- golang学习之旅(1)
- resultset 代码复用
- 使用Java对sftp带有中文路径的文件夹进行下载,乱码打不开文件夹
- Android Sensor Framework(狠详)
- 一文详解3D相机面临的困难问题和解决方案
- 基于Yolov5目标检测的物体分类识别及定位(三) -- 训练、测试
- linux build bash,Win10 Build 14316启用Linux Bash 环境图文教程
- WinDirStat下载使用指南,处理电脑空间神器
- 最佳Icon图标库推荐,收藏等于学会
- wifi mouse linux,WiFi Mouse Pro
- Google Sheet 学习笔记
- 论文写作——用excel和ppt做好看的论文图
- linux管理进程ps命令,ps命令进程管理-linux
- (论文笔记)SC4D: A Sparse 4D Convolutional Network for Skeleton-Based Action Recognition
- 关于app store distribution出现的'armv7'与最小版本'3.0'不兼容的问题
热门文章
- 【集合论】Stirling 子集数 ( 斯特林子集数概念 | 放球模型 | Stirling 子集数递推公式 | 划分的二元关系 加细关系 )
- 【设计模式】装饰者模式 ( 概念 | 适用场景 | 优缺点 | 与继承对比 | 定义流程 | 运行机制 | 案例分析 )
- 【Android 应用开发】 Fragment 详解
- 四种Sandcastle方法生成c#.net帮助类帮助文档
- Django 生成数据库表时的报错TypeError: __init__() missing 1 required positional argument: 'on_delete'...
- 第1次作业+105032014074
- Window.resizeTo()
- 图像五值化与基于三值图像的车牌识别(1)
- OS中关于父子进程的执行顺序和多个子进程之间的执行顺序(整理)
- iOS开发如何避免安全隐患