【递归】整数划分(C++)

article/2025/10/7 20:25:31

一、什么是整数划分

  • 所谓整数划分,是指把一个正整数n写成如下形式: n = m 1 + m 2 + ⋅ ⋅ ⋅ + m i n=m_1+m_2+···+m_i n=m1+m2++mi
    其中 m i m_i mi为正整数,并且 1 ≤ m i ≤ n 1 \leq m_i \leq n 1min,则 { m 1 , m 2 , ⋅ ⋅ ⋅ , m i } \{m_1,m_2,···,m_i\} {m1,m2,,mi}为n的一个划分。

  • 如果 { m 1 , m 2 , ⋅ ⋅ ⋅ , m i } \{m_1,m_2,···,m_i\} {m1,m2,,mi}中的最大值不超过m,即 m a x ( m 1 , m 2 , … , m i ) ≤ m max(m_1,m_2,…,m_i) \leq m max(m1,m2,,mi)m,则称它属于n的一个m划分。

  • 例如:当n=4时,它有5个划分,{4},{3,1},{2,2},{2,1,1},{1,1,1,1};
      注意4=1+3和4=3+1被认为是同一个划分。

  • 整数划分问题就是求出 n 的所有划分个数。

二、递归算法实现

1. 设计递归方程

思考:根据n和m的关系,有以下几种情况:(引用“百度百科”)

  1. 当n=1时,不论m的值为多少(m>0),只有一种划分即{1};
  2. 当m=1时,不论n的值为多少,只有一种划分即n个1,{1,1,1,…,1};
  3. 当n=m时,根据划分中是否包含n,可以分为两种情况:
    1. 划分中包含n的情况,只有一个即{n};
    2. 划分中不包含n的情况,这时划分中最大的数字也一定比n小,即n的所有(n-1)划分。
    3. 因此 f ( n , n ) = 1 + f ( n , n − 1 ) f(n,n) =1 + f(n,n-1) f(n,n)=1+f(n,n1)
  4. 当n<m时,由于划分中不可能出现负数,因此就相当于 f ( n , n ) f(n,n) f(n,n)
  5. 当n>m时,根据划分中是否包含最大值m,可以分为两种情况:
    1. 划分中包含m的情况,即 { m , { x 1 , x 2 , ⋅ ⋅ ⋅ , x i } } \{m,\{x_1,x_2,···,x_i\}\} {m,{x1,x2,,xi}},其中 { x 1 , x 2 , ⋅ ⋅ ⋅ , x i } \{x_1,x_2,···,x_i\} {x1,x2,,xi}的和为n-m,可能再次出现m,因此是(n-m)的m划分,因此这种划分的个数为 f ( n − m , m ) f(n-m, m) f(nm,m)
    2. 划分中不包含m的情况,则划分中所有值都比m小,即n的(m-1)划分,个数为 f ( n , m − 1 ) f(n,m-1) f(n,m1)
    3. 因此 f ( n , m ) = f ( n − m , m ) + f ( n , m − 1 ) f(n, m) = f(n-m, m)+f(n,m-1) f(n,m)=f(nm,m)+f(n,m1)

综上所述:
{ f ( n , m ) = 1 n = 1 ∣ ∣ m = 1 f ( n , n ) n < m 1 + f ( n , m − 1 ) n = m f ( n − m , m ) + f ( n , m − 1 ) n > m \begin{cases} f(n, m)= 1 & n=1 || m=1 \\ f(n, n) & n<m \\ 1+ f(n, m-1) & n=m \\ f(n-m,m)+f(n,m-1) & n>m \end{cases} f(n,m)=1f(n,n)1+f(n,m1)f(nm,m)+f(n,m1)n=1m=1n<mn=mn>m

2. 编写程序代码

此程序不仅计算了划分个数,而且输出打印了所有的划分形式(移除show()函数可移除此功能)。
注:show()函数曾借鉴学习于一位博主,但是找不到这位了qaq。

// 整数划分的递归实现算法
#include <iostream>
#include <string>
using namespace std;int int_HuaFen(int n, int m);
void show(int n, int m, string s);int main()
{string s; // 用于展示所有整数划分形式int n = 1; // 用于整数划分的整数cout << "请输入一个正整数进行整数划分:";cin >> n;cout << "全部划分为:" << endl;show(n, n, s);cout << "划分数为:" << int_HuaFen(n, n) << endl;return 0;
}// 递归计算划分数
int int_HuaFen(int n, int m)
{if (n == 1 || m == 1)return 1;else if (n < m)return int_HuaFen(n, n);else if (n == m)return 1 + int_HuaFen(n, n - 1);elsereturn int_HuaFen(n, m - 1) + int_HuaFen(n - m, m);
}// 递归展示所有划分形式
void show(int n, int m, string s) {if (n == 1 || m == 1) {for (int i = 0; i < n - 1; i++)s += string("1+");cout << s << "1\n";return;}else if (m > n) {return show(n, n, s);}else if (n == m) {cout << s << n << endl;return show(n, m - 1, s);}if (n - m != 0)show(n - m, m, s + to_string(m) + string("+"));elsecout << s << m << endl;show(n, m - 1, s);
}

3. 运行结果展示

运行截图

三、友情链接~

  • 其它一些常见算法请参阅此链接~

最后,非常欢迎大家来讨论指正哦!


http://chatgpt.dhexx.cn/article/2EIwEtue.shtml

相关文章

整数划分问题的递归解决(详解)

整数划分问题 这个问题在网上其实有好多博客、文章&#xff0c;本人认为讲的都稍有粗略&#xff0c;这篇文章是个人写的认为稍微详细一点的&#xff01;&#xff01; 将正整数n表示为一系列正整数之和&#xff0c; nn1n2n3n4......nk &#xff08;其中&#xff0c;n1>n2&…

整数划分算法

整数划分问题 问题阐述 将正整数n表示成一系列正整数之和&#xff1a;nn1n2…nk&#xff0c; 其中n1≥n2≥…≥nk≥1&#xff0c;k≥1。 正整数n的这种表示称为正整数n的划分。 输入&#xff1a;一个正整数n 输出&#xff1a;n不同划分个数以及n的划分结果。 问题实例 …

整数划分总结

博客原地址&#xff1a;https://blog.csdn.net/dacc123/article/details/50664738 整数划分问题&#xff1a; 笼统上说就是将一个整数划分成若干个整数之和的方案数。整数划分有很多不同的问法&#xff0c;也有比较隐晦的问法。比如n个苹果放到m个盘子里&#xff0c;比如n个砖块…

整数划分问题(分治算法经典)

题目描述&#xff1a; 整数划分问题是将一个正整数n拆成一组数连加并等于n的形式&#xff0c;且这组数中的最大加数不大于n。 即&#xff1a;nn1n2…nk; n1>n2>n3…>nk 如整数的6划分为: 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 …

数据源:SHP数据下载平台

1. 地理信息专业知识服务系统 中国工程院 中国工程科技知识中心 2. 国家基础地理信息中心 自然资源部 国家基础地理信息中心 3. 天地图API 自然资源部 国家基础地理信息中心 4. 中国科技资源共享网 科技部 国家科技资源共享服务工程技术研究中心 5. 地球大数据科学工…

使用ARCGIS对shp数据添加投影坐标系

系统工具箱→data management tool→投影和变换→定义投影 输入需要添加投影的shp 选择需要的投影坐标系

【使用QGIS入库将shp数据导入postgis、postgres数据库】

使用QGIS入库将shp数据导入postgis、postgres数据库 第一步&#xff0c;安装并打开QGIS软件 第二步&#xff0c;连接PostGIS数据库 在弹出的连接信息界面中配置数据库连接参数 输入数据库连接参数后点击ok 数据库连接成功则自动保存配置信息 第三步&#xff0c;打开数据导入…

2.1.2Arcpy开发记录_shp数据类型描述

Demo实现功能&#xff1a;print出输入.shp的数据类型&#xff0c;如线&#xff0c;面&#xff0c;点 官方文档&#xff1a;Describe 对象属性—ArcMap | 文档 本机环境&#xff1a;ArcGIS10.3&#xff0c;Python27 import arcpy import osfolder rE:/2021work/TJ_J/pythonT…

geotools将shp数据存入postgres

一、引入geotools的依赖 引入geotools的方法 <dependency><groupId>org.geotools</groupId><artifactId>gt-shapefile</artifactId><version>27-SNAPSHOT</version></dependency><dependency><groupId>org.geot…

全国高铁线路及站点shp数据(2020年)

名称&#xff1a;全国高铁线路及站点shp数据&#xff08;2020年&#xff09; 区域范围&#xff1a;全国 时间范围&#xff1a;2020 语言&#xff1a;中文 格式&#xff1a;.shp 该数据为2020年的全国范围的高铁线路和站点数据&#xff0c;格式为shp格式&#xff0c;坐标为wgs19…

深圳市“详规一张图”shp数据爬取后数据表无法打开的问题解决办法

最近在研究爬取深圳市规自局网站上的“详规一张图”数据&#xff0c;无奈爬虫技术太低&#xff0c;无意中看到了大佬“Atom数据”的“深圳详规“一张图”数据获取【代码更新】”一文中给出的代码爬取方案&#xff0c;再次感谢&#xff01; 然而在经历了千辛万苦之后终于将详规一…

FME将用SHP数据对栅格影像数据进行裁剪

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、需求二、实操 1.数据准备2.FME的流程设置3.裁剪的结果总结 前言 利用FME对数据进行操作与处理的过程。 一、需求 裁剪出shp范围内或者范围外的栅格影像数…

三步教你免费下载省,市,区县行政区Shp数据

摘要&#xff1a;一般非专业的GIS应用通常会用到省市等行政区区划边界空间数据做分析&#xff0c;本文简单介绍了如何在互联网上下载省&#xff0c;市&#xff0c;区县的shp格式空间边界数据&#xff0c;并介绍了一个好用的在线数据转换工具&#xff0c;并且开源。 一、首先&a…

数据处理(1):十万加SHP数据重载导入标准字段图层

使用工具&#xff1a;Arcgis 时常我们会从客户、网络得到数据&#xff0c;但是数据里面字段名于公司规定得字段名有出入&#xff0c;此时就需要进行数据调整&#xff0c;首先我们打开软件“ArcCatalog” 在任意文件夹下右击&#xff0c;选择“新建-文件地理数据库”&#xff0c…

shp数据中文乱码的一种恢复方法

一、准备 1、QGIS软件 2、乱码识别网站 二、转换步骤 &#xff08;一&#xff09;示例展示 如图&#xff0c;有一个不知道怎么产生的shp文件&#xff0c;在arcmap中&#xff0c;中文字段显示乱码&#xff0c;添加cpg文件后&#xff0c;仍然无法解决。 &#xff08;二&…

【GlobalMapper精品教程】053:打开dbf文件并生成有坐标系的shp数据

本文讲解在globalmapper汇总打开dbf文件并生成有坐标系的shp数据。 文章目录 一、dbf文件解读二、打开dbf文件二、另存为shp文件一、dbf文件解读 我们可以通过Excel或FME等多种软件查看dbf的结构,字段有:Name,kind,Lat,Lon,其中Lon为经度,Lat为纬度,我们后续一定是通过…

html 显示shp,cesium加载本地shp数据

用户选择本地磁盘shp数据后,直接在三维球上展示。本文默认已经有了vue和cesium整合后的工程。 官网地址:git://github.com/wavded/js-shapefile-to-geojson.git 1、vue-cli3.x+cesium的项目目录 image.png 2、CesiumViewer.vue代码: 加载shp数据 import Cesium from cesium/…

将shp数据导入SQL Server

记录Shape2SQL的使用过程及注意事项 20220322更新&#xff1a;出现30万行线要素导入后不显示的问题&#xff0c;分两次导入就正常了&#xff0c;没有找到原因&#xff0c;隔壁30万行点要素没出问题 一、Shape2SQL工具可以将shape数据导入SQL Server 2008R2 下载地址&#xf…

重庆市最新轨道交通SHP数据 - 202201

重庆市最新轨道交通SHP数据 - 202201 由于最近需要用到重庆市的轨道交通数据&#xff0c;但下载到的数据略有缺&#xff0c;因此对着重庆轨道交通集团提供的图及QGIS中的OSM&#xff0c;对下载的数据进行了修正。 下图是在QGIS中结果。共有站点193个&#xff0c;路线11条&…

shp数据制作3DTiles白膜

3D Tiles格式介绍 3D Tiles用于大场景的三维模型。 3D Tiles是一个开放的规范&#xff0c;用于传输海量的异构三维地理空间数据集。使用概念上类似于terrain和imagery的瓦片流技术&#xff0c;3D Tiles 使得建筑物数据集、BIM模型、点云和摄影测量模型等大模型比较流畅的在Web…