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

整数划分问题(分治法) 题目: 将正整数n表示成一系列正整数之和:n=n1+n2+…+nk, 其中n1≥n2≥…≥nk≥1,k≥1。 正整数n的这种表示称为正整数n的划分。求正整数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。 分析: 在本例中,如果设p(n)为... 阅读详情

将正整数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;
 }


在这里插入图片描述

整数划分问题(分治算法经典) 题目描述: 整数划分问题是将一个正整数n拆成一组数连加并等于n的形式,且这组数中的最大加数不大于n。 即:n=n1+n2+…+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 + 1 + 1 + 1 1 + 1 + 1 + 1 + 1 + 1共11种。 补充:正整数的这种操作称为正整数的划分,正整数的不同 阅读详情

相关推荐

计算机算法设计与分析(第4版) 王晓东 著 2012.2 笔记(这本书还不错,偏实用、有难度)

计算机算法设计与分析(第4版) 目录 1 算法概述2 递归与分治策略3 动态规划4 贪心算法5 回溯法6 分支限界法7 随机化算法8 线性规划与网络流 算法概述 复杂性分析NP-完全性理论 递归与分治策略 排列问题:Permutate 注意,递归嵌套在一个函数里,特别选择参数k,k之前的代表已经固定,k之后的依次交换并递归

cteng的专栏 1万+

整数划分(递归)

将正整数n表示成一系列正整数之和 n=n1+n2+......+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+1+1+1; 1+1+1+1+1+1+1; 所以对于正整数6有P(6)=11中划分 在正整数n的所有不同划分中,将最大加数n1不大于m的划分个数记作q(n,m)。 有

weiyang_8765的博客 866

C语言实现:将正整数n划分成一系列的正整数之和,计算共有多少种划分方法(递归、分治法)

C语言实现:将正整数n划分成一系列的正整数之和,计算共有多少种划分方法(递归)(分治法)

寒水馨 · 轻量级技术文档 · hanshuixin.org 1151

算法设计与分析——递归——整数划分问题

将正整数n表示成一系列正整数之和,n = n1 + n2 +..... + nk (n1 ≥ n2 ≥ ...... ≥ nk ≥ 1,k ≥ 1) .正整数n的这种表示称为正整数n的划分,正整数n的不同的划分的个数称为正整数n的划分数,记作p(n)。

Blackoutdragon的博客 647

分治与递归分析

递归与分治分析 适合用递归算法来解决的常见问题有: (1)二分搜索技术; (2)大整数乘法; (3)Strassen矩阵乘法; (4)棋盘覆盖; (5)合并排序和快速排序; (6)线性时间选择; (7)最接近点对问题; (8)循环赛日程表。  算法总体思想   对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,

愿君出走半生,归来时仍是少年 2866

从零开始用STM32驱动RGB屏:配置PCLK、DE同步信号的避坑指南

本文详细介绍了如何使用STM32驱动RGB接口LCD屏幕,重点解析了PCLK配置、同步信号极性和DE使能等关键参数的设置方法。通过实战代码示例和常见问题排查指南,帮助开发者避免常见配置错误,实现稳定的显示效果。特别针对800x480 IPS屏提供了优化建议和调试技巧。

sky77的博客 539

重拾算法之路——递归与分治基础

重拾算法之路——递归与分治基础

继续激情,继续奋斗。 1320

C#实现不占用串口的串口监听与侦听技术:高效监控串口数据的最佳实践

本文详细介绍了如何实现不占用串口的串口监听与侦听技术,解决了传统串口监听可能带来的串口占用问题。通过使用虚拟串口、外部监听工具或第三方库,我们可以高效地实现串口数据的捕获与处理,适用于各种工业控制、物联网和嵌入式开发的应用场景。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1671

算法设计与分析python

对于矩阵链 A1,A2,...,AnA_1, A_2, ..., A_nA1​,A2​,...,An​,找到最小的标量乘法次数。

ninia33的博客 903

IP白名单校验

支持格式: 1、127.0.0.1 // 指定固定IP 2、127.0.0.1-127.0.0.128 // 可使用“-”来表示一个IP区间,支持跨IP段(一般不会出现这种情况,跨IP段则配置多个规则) 3、127.0.* // 2~4位IP段可...

2199

安装Tailscale

如果返回 /usr/bin/tailscale 或类似路径,说明已安装但 sudo 可能找不到它。如果 which tailscale 没有输出,说明安装失败,重新执行安装步骤。Tailscale 的后台服务 tailscaled 必须运行。检查 tailscaled 服务是否运行。检查 tailscale 命令是否存在。

FairLikeSnow的博客 1470

递归与分治策略

1、全排列问题:设R(n)={r[1],r[2],…,r[n]}是要进行排列的n个元素。集合X中元素的全排列记为Perm(X)。求R(n)的全排列Perm(R(n))。 用递归算法求解:

Jack Zhou的专栏 8173

基于Simulink的魔术公式轮胎动力学仿真

本篇博文主要用来记录汽车系统动力学课程的学习,仅供课程阶段参考,与实际工程应用还有较大距离。基于Simulink的魔术公式轮胎动力学仿真本实例主要有以下任务。1.建立魔术公式轮胎动力学仿真模型。2.绘制不同载荷下的轮胎纵向力—滑动率关系曲线。3.绘制不同载荷下的轮胎侧向力—侧偏角关系曲线。4.绘制不同载荷下的轮胎回正力矩—侧偏角关系曲线。提示:以下是本篇文章正文内容,下面案例可供参考。

shy_201992的博客 6940

2.递归分治策略

程序之间或者间接调用自身的程序1.斐波那契数列。

2301_81873056的博客 265

解锁Vscode:C/C++环境配置超详细指南

本文详细介绍如何在 VSCode 中配置 C/C++ 开发环境,帮助开发者快速搭建高效的编码调试环境。内容涵盖前期准备、软件下载安装、环境变量配置、工作区文件设置及测试运行全流程:首先需准备 VSCode 编辑器、MinGW-w64 编译器及 C/C++ 插件;接着完成工具下载与安装,配置系统环境变量以确保编译器可全局调用;然后通过创建.vscode工作区文件夹,配置核心文件,实现代码智能提示与调试功能;最后通过编写 Hello World 示例验证环境可用性,并附上常见问题排查方案。

邓邓子的博客 3046

【推荐100个unity插件】将UE的资源导出到unity使用—— Exporter for Unreal to/for Unity插件

Unreal to Unity导出器是一款帮助开发者将Unreal Engine项目转换为Unity的工具。文章详细介绍了使用步骤:1)安装虚幻引擎并创建项目;2)在Plugins文件夹中安装导出插件;3)导入UE资产到Content文件夹;4)配置导出参数并完成转换。文末推荐了多个Unity开发专栏,涵盖C#编程、2D/3D开发、特效制作等内容。作者向宇提供了博客地址,欢迎读者交流学习。该工具能有效提升项目迁移效率,适合需要跨引擎开发的用户使用。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 848

算法分析上课笔记(1)

#递归与分治策略 递归的概念:直接或间接地调用自身的算法称为递归算法 例:二叉树的先序遍历 分治法的的设计思想:将一个难以直接解决的大问题, 分割成一些规模较小的相同问题,以便各个击破, 分而治之。(对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直 到问题规模足够小,很容易求出其解为止。)(自底向上) 递归与分治法经常同时应用到算法设计之中。 ##1.阶乘函数 边界条件与递归方程是递归函数的两个要素,递归函数只有具备了这两个要素,才能在有限次计算后得出结果。

qq_45667304的博客 359

Spring AI Alibaba实战训练营-16 NL2SQL (自然语言转 SQL)应用开发指南

本文介绍了一个基于AI的智能BI应用开发项目,主要实现自然语言转SQL(NL2SQL)功能,包含对话模块、MCP模块、向量数据管理模块。项目采用Spring AI Alibaba框架,集成通义千问大模型,支持内存向量库和AnalyticDB向量数据库两种存储方案。重点展示了chat模块的三个控制器实现:AnalyticNl2SqlController用于生产环境,SimpleChatController适用于开发测试,Nl2sqlForGraphController支持基于图的复杂对话流程。系统通过将业务知

program哲学 1585

中国矿业大学计科算法导论菜鸟笔记

中国矿业大学计科算法导论笔记

weixin_53711294的博客 1242

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

递归与分治策略(2)

例5 整数划分问题 将正整数n表示成一系列正整数之和:n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1。 正整数n的这种表示称为正整数n的划分。正整数n的不同划分个数称为正整数n的划分数,记作p(n)。 例如正整数6有如下11种不同的划分,所以p(6) = 11: 6; 5+1; 4+2,4+1+1; 3+3,3+2+1,3+1+1+...

weixin_33714884的博客 309

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

SCAU算法设计与分析 —— 递归与分治

本文介绍了三个算法问题的解决方案:1) 使用递归解决有重复元素的排列问题,通过交换元素和去重检查生成排列;2) 采用排序和双指针法高效求解众数问题;3) 运用动态规划计算将礼物分配到盒子的方法数,并通过前缀和优化提升效率。主要算法包括递归回溯、排序扫描和动态规划。

2402_85909911的博客 364

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

分治策略(二分查找,排列问题,整数划分,合并排序,堆排序,快速排序,线性选择,最大子段和问题)

把规模大的问题,分成规模小的多个问题,逐个解决。把原问题分割成若干问题,且这些子问题是可解的,这些问题可以解决原问题。

2402_84699040的博客 194

算法之递归与分治

0、目录 算法概念与设计分析 例题 1、算法概念与设计分析 算法总体思想-大事化小小事化了   对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很容易求出其解为止。   将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。   分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相...

qq_41278826的博客 636

算法分析设计--递归算法

What’s the 递归算法 定义: 程序直接或间接调用自身的编程技巧称为递归算法(Recursion)。 一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量 特点: 任何一个可以用计算机求解的问题所需的计算时间都与其规模n有关。问题的规模越小,越容易直接求解,解题所需的计算时间也越少。 分治法的设计思想是,将一个难以直接解决的大问题

日拱一卒,功不唐捐 4092

分治思想加例题

但是我们应该在什么时候用分治呢?这个问题也困扰了我很久,做题的时候就不知道用什么算法 能用分治法的基本特征: 1.问题缩小到一定规模容易解决 2.分解成的子问题是相同种类的子问题,即该问题具有最优子结构性质 3.分解而成的小问题在解决之后要可以合并 4.子问题是相互独立的,即子问题之间没有公共的子问题 第一条大多数问题都可以满足 第二条的大多数问题也可以满足,反应的是递归的思想 第三条:这个是能分...

abc1235454的博客 274

算法分析与设计笔记(一)

算法设计与分析之入门篇 跟着视频学习,感觉这里面的主要算法很重要! 对很多经典的问题理解不够。 复杂度分析 低阶函数 同阶函数 高阶函数 master定理求解阶数/迭代法求解具体的 递归方程 整数划分问题 将正整数n表示成一系列正整数之和,n=n1+n2+n3+......nk(其中,n1&gt;=n2&gt;=......nk&gt;=1,k&gt;=1),正整数n的这种...

weixin_34190136的博客 270
上一篇: 如何使用exclipse打开已有的文件夹
下一篇: 算法设计与分析——分支限界法——装载问题
943802606
博客等级 码龄6年 1万+粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值