整数划分问题(python)--递归 and 动态规划(m个盘里放n个苹果思想类似)

【动态规划】将一个包含m个整数的数组分成n个数组,每个数组的和尽量接近,及其变形(Python实现) 背景 实际的问题来源于LQA系统的人员分配工作量,有两种方式,一种是 平均分配,一种是按给定比例分配。不需要AC,能得到符合题意的解就算达成目标。 平均分配 一个order订单包含一个xls表格,内含若干词条,需要把词条分配给若干LQA,每个人负责的词条总字数大致相近就好,不必完全一致。 词条不可拆分,分配工作量的占比是按字数占比。 另外延伸一个应用情况: 已知现在有x个小组,(小组之间人数差距比较大,假设有的100人,有的10个人,),需要分成n个部门。要求,小组不能拆分,各个部门的人数较为均衡。求,每个 阅读详情

这篇博客旨在对正整数划分的多种题目就递归和动态规划进行讨论与总结

以下将正整数划分分为三种题型:1.一般性,即对个数以及大小以及重复性不加约束 2.对重复性有约束 3.对元素的个数有约束。至于每个元素的大小则可以归并到第一类题:通过更改q(n,m)的参数m即可。

1.

问题描述:

描述
将正整数n 表示成一系列正整数之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。 
正整数n 的这种表示称为正整数n 的划分。正整数n 的不同的划分个数称为正整数n 的划分数。
输入
标准的输入包含若干组测试数据。每组测试数据是一个整数N(0 < N <= 50)。
输出
对于每组测试数据,输出N的划分数。
样例输入
5
样例输出
7
提示:
5, 4+1, 3+2, 3+1+1, 2+2+1, 2+1+1+1, 1+1+1+1+1

解题思路:

如题,令p(n)表示正整数n的划分数,则难以找到递归关系,因此增加一个自变量m,设定最大加数n1不大于m的划分个数。即p(n)=q(n,m),则有以下关系:

1.首先当n=0:return 1:表示已经被分完

2. m=0:则无法实现,即return 0

3.当m=1 or n=1:则return 1(n=1:则由1组成;m=1:则由n个1组成这两种情况都是一种方式)

4.当n<m则满足:q(n,m)=q(n,n) :n的划分由n1<=n的划分组成

5.当n=m:q(n,m)=1+q(n,m-1):正整数n的划分由n1=n的划分和n1<=n-1的划分组成

6.n>m>1:q(n,m)=q(n,m-1)+q(n-m,m):正整数n的最大加数不大于m的划分由n1=m的划分和n1<=m-1的划分组成

其中第一条用于控制划分的情况,第二条用于可以划分的终止条件

代码实现:

1.递归:则根据以上的解题思路进行写代码即可:

#-*-coding:utf-8 -*-
def dfs(n,m):
    if n==0:
        return 1
    elif m==0:
        return 0
    elif n==1 or m==1:
        return 1
    elif n<m:
        return dfs(n,n)
    elif n==m:
        return dfs(n,m-1)+1
    else:
        return dfs(n,m-1)+dfs(n-m,m)
if __name__ == '__main__':
    n,m=map(int,raw_input().split()) #如果没有限制,即m<=n即可,则将下一行中的m改成n即可
    print dfs(n,m)

2.动态规划:利用动态规划解题最重要的就是状态转移方程,还有边界控制,本题为体现一般性,则先进行利用动态规划打表即(m=n),然后根据实际的m输出dp[n][m]即可

状态转移方程:即解题思路的3、4、5,边界条件:dp[0][0]=1,注意建立(n+1)*(n+1)dp二维列表

#-*-coding:utf-8 -*-
#求整数n的划分数
while True:
    try:
        n=int(raw_input())
        dp=[[0 for i in range(n+1)] for j in range(n+1)]
        dp[0][0]=1
        for i in range(1,n+1):
            for j in range(1,n+1):
                if i < j:
                    dp[i][j]=dp[i][i]
                elif i==j:
                    dp[i][j]=1+dp[i][j-1]
                else:
                    dp[i][j]=dp[i][j-1]+dp[i-j][j]
        print dp[n][n]
    except:
        break


2.

问题描述大致1,增加限制条件,每一种划分方案的组成元素不重复

解题思路:

同题1不同的是:本题增加了限制条件不可重复性,有如下递归关系:

1.n=0:return 1,当n=0时,表示已经分完

1.m<1 :return 0:m=0的时候无法继续划分

3.n<m:p(n,m)=p(n,n) 

4.p(n,m)=p(n-m,m-1)+p(n,m-1) :p(n-m,m-1)表示先拿出一个m,剩下的n-m在n1<=m-1的划分数;p(n,m-1)指n在n1<=m-1的划分数

代码实现:

1.递归:注意递归的终止调价

2.动态规划:状态转移方程:dp[i][j]=dp[i-j][j-1]+dp[i,j-1]

#-*-coding:utf-8 -*-
#划分为不同整数
while True:
    try:
        n=int(raw_input())
        dp=[[0 for i in range(n+1)] for j in range(n+1)]
        dp[0][0]=1
        for i in range(n+1):
            for j in range(1,n+1):
                if j>i:
                    dp[i][j]=dp[i][i]
                else:
                    dp[i][j]=dp[i][j-1]+dp[i-j][j-1]
        print dp[n][n]
    except:
        break


3.

问题描述同1,增加限制条件,每一种划分方案规定元素个数

解题思路:

同题1不同的是:该题限定了元素个数m,则m<=n,因此p(n,m)的理解是n划分为m个元素,有如下递归关系:

1.m=1 or m=n:return 1:n划分为一个元素或者划分为n个元素,很明显只有一种情况

2.m<1 or n<1:return 0:0无法划分以及无法划分为0个元素

3.p(n,m)=p(n-m,m)+p(n-1,m-1) :p(n-m,m)是指m个都分1,然后n-m在m个元素上进行分;p(n-1,m-1)指n-1划分为m-1个数

代码实现:

1.递归:根据解题思路建立递归方程,注意终止条件

#-*-coding:utf-8 -*-
def dfs(n,m):
    if n==m or m==1:
        return 1
    elif n<1 or m<1:
        return 0
    else:
        return dfs(n-1,m-1)+dfs(n-m,m)
if __name__ == '__main__':
    n,m=map(int,raw_input().split())
    print dfs(n,m)


2.动态规划:状态转移方程:dp[i][j]=dp[i-1][j-1]+dp[i-j][j]

#-*-coding:utf-8 -*-
#求整数n划分成k个整数的划分数
while True:
    try:
        n,k=map(int,raw_input().split())
        dp=[[0 for i in range(n+1)] for j in range(n+1)]
        dp[0][0]=1
        for i in range(1,n+1):
            for j in range(i+1):
                if j==1:
                    dp[i][j]=1
                else:
                    dp[i][j]=dp[i-1][j-1]+dp[i-j][j]
        print dp[n][k]
    except:
        break


以上是本人对整数划分的几种情况就递归以及动态规划进行的分析,经实践证明,如果数据较大,递归运算时间比动态规划慢。虽然递归结构清晰,可读性强,而且易用数学归纳法证明算法的正确性,但是运行效率很低。因此,递归是设计算法的有效工具,优化算法时可以将递归转化为非递归算法。

ps:分苹果、分蛋糕问题也可以根据本文的思路解决。根据实际情况增加相应的限制条件即可







动态规划--m个苹果放入n个盘子问题 [size=medium]问题描述: 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。 输入 每个用例包含二个整数M和N。0... 阅读详情

相关推荐

整数划分算法全解析:从递归到动态规划与实战应用

动态规划是解决复杂计算问题的核心算法范式,其核心思想是将大问题分解为重叠子问题,并通过存储子问题的解来避免重复计算,从而显著提升效率。这一原理在组合计数、资源优化等领域具有极高的技术价值,尤其适用于任务调度、投资组合、路径规划等需要枚举或优化组合方案的场景。本文以经典的整数划分问题为具体载体,深入剖析其递推关系与状态转移方程,并详细对比了递归、记忆化搜索及动态规划等多种实现方案。通过结合零钱兑换等高频搜索问题,文章进一步阐释了如何将通用算法思想应用于解决‘组合数’、‘最少完全平方数’等工程实践问题,并探讨了

weixin_33801856的博客 357

男人8题之Tony's TourPKU1739基于连通性状态压缩的动态规划

http://acm.pku.edu.cn/JudgeOnline/problem?id=1739<span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-

陆科杰(C/C++) 6107

Tinder养号防封攻略来了:最新Tinder养号流程和运营攻略

今天,我就来给大家分享一下Tinder养号的具体操作,以及针对Tinder账号被封的一些常见问题为大家做个答疑。

m0_67768117的博客 2万+

感人:留给老婆下任老公的信

下任, 老公, 老婆, 感人1、 吵架时,要记得立即哄她,如果她不听,就过一会等她冷静了不闹了,再去哄。 , h: q# k( G+ x  2、 不要总试着去数落她的不是,有时候,她只是需要一个可以依靠的肩膀,而不是一大堆其实她已经懂得的道理。 ( J( S6 {- D4 m) @' i  3、 她喜欢KT,记得平时有KT的可爱的小物品或者娃娃,要买给她,这样她会开心很多。 5 i1 z2 M" ...

peterhon168的博客 5377

Mac新手必看:为什么你的终端找不到Python命令?5分钟搞定zsh报错

本文针对Mac用户在终端遇到“zsh: command not found: python”报错的问题,提供了深度解析与实战修复指南。文章解释了macOS系统因历史原因默认使用`python3`而非`python`命令,并详细介绍了四种解决方案:养成使用`python3`的习惯、创建别名、通过Homebrew安装链接以及修改PATH环境变量,帮助新手快速解决zsh报错,顺利开始Python开发。

weixin_29248653的博客 594

Win11笔记本BIOS设置避坑大全:Secure Boot、RST、UEFI引导,一次讲清

本文详细解析了Win11笔记本BIOS设置中的关键问题,包括Secure Boot、Intel RST和UEFI引导的配置方法,帮助用户避开双系统安装中的常见陷阱。特别针对不同品牌笔记本的BIOS界面差异,提供了实用的操作指南和优化建议,确保系统兼容性和启动效率。

weixin_29251131的博客 688

【动态规划】将一个包含 m 个整数的数组分成 n 个数组,每个数组的和尽量接近

1 背景 ClickHouse集群缩容,为保证数据不丢失,计划将需要缩容的节点上的数据,迁移到其他节点上,保证迁移到每个机器上的数据量尽量均衡。数据的迁移已partition为单位,已知每个partition的数据量。 2 抽象 将一个包含m个整数的数组分成n个数组,每个数组的和尽量接近 3 思路 这个问题是典型的动态规划的问题,理论上是无法找到最优解的,但是本次只是为了解决实际生产中的问题,而不是要AC,所以我们只需要找到一个相对合理的算法,使得partition的分配相对均衡就好了。 输入:

Bingo 9057

ORB-SLAM3的Euroc数据集测试

(一)测试运行 不同模式测试过程(以MH_03为例) 1、pure mono 运行SLAM: cd ORB-SLAM3/Example #run slam ./Monocular/mono_euroc ../Vocabulary/ORBvoc.txt ./Monocular/EuRoC.yaml "$pathDatasetEuroc"/MH03 ./Monocular/EuRoC_TimeStamps/MH03.txt dataset-MH03_mono 利用ORB-SLAM3自带..

ljtx200888的博客 9146

乱七八糟的都先放这里了4

当枚举与DP结合时,可以在枚举dfs过程,改变i之后,只更新i之后的DP数组,复杂度从Opnn变为O∑i1n​pin−i)),估计一下会少个n。一种每个东西状态只会改一次(特指从x变为同一数)的题,可以考虑暴力,常见手段为摊还分析和并查集。考虑一类数列上建图的贪心问题中,图中环、链是否有编号连续的性质。如果每次询问区间的某个值,又是离线的,建议想想分治。(loj6490)线段树有多个值多个复杂操作难以讨论维护,考虑运用(max,+)等矩阵。(uoj164)

chenguoyi7的博客 876

Qt+VS集成高德红外相机SDK与OpenCV的采图实践

本文详细介绍了在Qt和Visual Studio环境中集成高德红外相机SDK与OpenCV的完整实践方案。涵盖环境配置、SDK初始化、图像采集与处理、多线程优化等关键技术点,重点解决了高德红外相机数据转换、温度信息提取和Qt界面显示优化等核心问题,为红外图像处理应用开发提供可靠参考。

palm99的专栏 645

“探索thumbdata4文件的奥秘:编程中的神秘存在“

综上所述,thumbdata4文件在编程中是一个常见的存在,与图库应用程序和图片浏览器密切相关。通过使用适当的库和工具,我们可以读取和处理thumbdata4文件中的缩略图数据,以提供更好的用户体验。我们首先读取8字节的块头,其中包含了下一个缩略图块的大小。你可以根据自己的需求来定义对块数据的处理方式,例如将其保存为图像文件或进行其他的分析操作。thumbdata4文件通常以二进制格式存储,其中包含着设备上浏览过的图片的缩略图。因此,你可能需要根据具体的thumbdata4文件结构进行适当的解析和处理。

JieLun_C的博客 792

OJ 百练 1664:放苹果(整数划分问题)

对划分函数q(n,m)的另一种理解是,n表示苹果的数量,m表示可以用来放置苹果的盘子的个数,允许有的盘子空着不放,q(n,m)即是求将n个苹果放到m个盘子中,有多少种不同的分法。将n个苹果进行划分,考虑在划分中最大加数为m,也就是限制某个盘子中最多的苹果数量是m,那么有两种情况,一种情况是确实存在这样一个盘子,其中苹果的数量是m,这时我们只需要考虑剩下的n-m个苹果进行划分,限制某个盘子中最多的苹果数量是m,也就是q(n-m,m);(用K表示)5,1,1和1,5,1 是同一种分法。1<=M,N<=10。

m0_62504307的博客 1176

最小二乘(MLS)求点云法向量

MLS算法的基本思想是通过在点云的局部邻域内拟合一个光滑曲面,如平面或多项式曲面,以此来重建和处理点云数据。对于法向量估计,MLS通常在每个点的邻域内拟合局部平面,然后从该平面的法向量作为点的法向量。

twnkie的博客 744

放苹果(递归、动态规划、python)

放苹果 描述 把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法? 注意:如果有7个苹果和3个盘子,(5,1,1)和(1,5,1)被视为是同一种分法。 数据范围:0 <= m <= 10 ,1 <= n <= 10 。 输入描述: 输入两个int整数 输出描述: 输出结果,int型 示例1 输入: 7 3 输出: 8 分析 方法1递归 目标函数:f(m, n) ------> m个苹果放入n个盘子的放法 case 1:f(m, n) =

李波的blog,一名喜欢编程和分享技术的研究僧~ 5876

AutoSar实战营 - 总目录

欢迎大家来学习《AutoSar实战营》专栏,该篇为总目录,方便以后大家直接进入需要学习的文章。 ~正所谓独乐乐不如众乐乐 - - ~1, AutoSar之DaVinci开发环境2,BswM模块之Ecu State Handling1)读写DID功能 《AutoSar实战》读写DID之一:CDD准备 《AutoSar实战》读写DID之二:工具链配置 《AutoSar实战》读写DID之三:代码实现2)功能寻址 《AutoSar实战》禁止功能寻址

weixin_48498880的博客 3630

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

用python解决放苹果问题_放苹果

/*M个苹果放在N个盘子里分法有:dp[M][N], 0 <= M,N <= 10设dp(m,n) 为m个苹果,n个盘子的放法数目,则先对n作讨论,当m当m>=n:不同的放法可以分成两类:1、有至少一个盘子空着,即相当于dp(m,n) = dp(m,n-1);2、所有盘子都有苹果,相当于可以从每个盘子中拿掉一个苹果,不影响不同放法的数目,即dp(m,n) = dp(m-n,n)....

weixin_39633774的博客 1681

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

整数划分算法精讲:从递归到动态规划的完全背包解法

整数划分是组合数学与算法设计中的经典问题,核心是将正整数拆分为若干正整数之和的不同方式计数。其本质是研究组合对象的计数与生成,涉及递归分解与子问题重叠。在算法层面,整数划分是理解动态规划思想的绝佳案例,通过状态定义(如最大加数或划分个数)建立递推关系,能有效解决组合爆炸问题。该问题的优化解法与完全背包模型高度同构,利用一维DP数组可将空间复杂度降至O(n),在资源调度、数据分片等工程场景中有重要应用。本文聚焦于整数划分的高效动态规划实现,特别是基于完全背包模型的一维DP解法,并探讨其在算法面试与竞赛中的实践

weixin_30883311的博客 704

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

保姆级教程:用记忆化递归和动态规划优化‘放苹果’问题,告别OpenJudge超时

本文详细介绍了如何通过记忆化递归和动态规划优化‘放苹果’问题,解决OpenJudge上的超时问题。从朴素递归的性能瓶颈分析入手,逐步引入记忆化技术和动态规划方法,显著提升算法效率,适合信息学奥赛选手和算法爱好者学习。

weixin_30599769的博客 346

m个苹果放入n个盘子问题,n个盘子不同的问题

m个苹果放入n个盘子问题,n个盘子不同的问题         网上已经有许多关于,m个苹果放入n个盘子的问题(盘子相同),但是没有具体关于n个盘子不同的问题,在这里根据前面的n个盘子相同的基础上,进行分析得出相应的递推公式。针对前一问题这里不再详细介绍,具体的网页链接为:https://www.cnblogs.com/wxgblogs/p/5742618.html 问题描述:        ...

xinkengruo3162的博客 1862

动态规划--放苹果

题目来源: codeup 链接 && poj 1664 题目描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。 输入 第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。 输出 对输入的每组数据M和N,用...

圣托里尼的日落啊~的博客 381

放苹果(整数划分变形题 水)poj1664

问题:把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。 样例 : 1 7 3 ---------------8 5 5---------------7 思路: 当m>n时候 dp(m,n) 可以理解由  在每个盘子里放一个苹果后剩下的再随意放入n个盘子dp(m-n,n)的状态+最少一个盘子不放dp(m,

一只叫做Unix的猫 783

【简单】HJ61 放苹果(Python两种写法 递归+动态规划)

把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?注意:如果有7个苹果和3个盘子,(5,1,1)和(1,5,1)被视为是同一种分法。数据范围:0≤m≤10 0≤m≤10 ,1≤n≤10 1≤n≤10。

... 596

牛客网 放苹果 ---【DFS】

牛客网 放苹果 题目描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。 输入描述: 每行均包含二个整数M和N,以空格分开。1<=M,N<=10。 输出描述: 对输入的每组数据M和N,用一行输出相应的K。 示例1 输入 复制 1 7 3 输出 复制 8 经验总结 这是一道模板题,将M个物体划分为N个...

weixin_44348004的博客 292

61放苹果

题目描述 题目描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。 输入 每个用例包含二个整数M和N。0&lt;=m&lt;=10,1&lt;=n&lt;=10。 样例输入 7 3 样例输出 8 计算放苹果方法数目 输入值非法时返回-1 1 &lt;= m,n &lt;= 10 @param m 苹果数目 @...

wenlyq的博客 197

M个苹果放入N个盘子(递归)

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(5,1,1和1,5,1 是同一种分法)每个用例包含二个整数M和N。

Rhett_Butler0922的博客 341

m个苹果放入n个盘子问题

  这个问题,看似是一个简单的排列组合问题,但是加上不同的限制条件,会演变成不同的问题,感觉很奇妙,就总结一下列举下来 问题一   问题描述:把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问有多少种不同的分法?(注:5,1,1和1,1,5是同一种分法) 解题分析:   设f(m,n)为m个苹果,n个盘子的放法数目,则先对n作讨论, 当n&gt;m:则必定有n-m个盘子...

weixin_34392843的博客 1190
上一篇: 机器学习(周志华)第四章习题解答
下一篇: 快速幂与快速矩阵幂(以大数下的斐波那契数列为例)
carson0408
博客等级 码龄9年 238粉丝 225原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值