减绳子问题动态规划求解

用动态规划和贪心算法求解割绳子问题 先挖个坑,有空来仔细写注释 题目描述 给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],…,k[m]。请问k[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 输入描述: 输入一个数n,意义见题面。(2 <= n <= 60) 输出描述: 输出答案。 示例1 输入 复制 8 输出 复制 18 public int cut 阅读详情

问题描述

给你一根长度为N的绳子,请把绳子剪成M段(m,n都是整数),每段绳子的长度记为k[0],k[1],k[2]…. 请问如何剪绳子使得k[0],k[1],k[2] …的乘积最大
约定:剪出来的每段小绳子也必须为整数

例如 绳子长度8 剪成3段 最大乘积18 = 2*3 *3

输入

输入只有1行,分别为N,M;
其中N表示绳子的长度,M表示要剪成的段数。
0<=N<=1000
0<=M<=100

输出

输出只有一行,maxsum
表示所有小段绳子的最大乘积

输入样例

8 3

输出样例

18

思路

典型的动态规划问题。
创建一个二维数组m[i][j]表示长度为i的绳子裁剪成j段的乘积最大值。

当i>j时,存在k(1<=k<=i-j+1)使得m[i][j]=k*m[i-k][j-1]

这里给出状态转移方程。

在这里插入图片描述

代码

#include <iostream>
using namespace std;
#include<stdio.h>
#include<stdlib.h>
#include<cstring>
#include<math.h>
long long m[1001][101];
//m[i][j]表示把长度为i的绳子裁剪为j段的最大乘积
//for(i=1;i<=n;i++)  m[i][1]=i;裁成1段乘积就是原长度
//for(j=1;j<=m;j++) if(i<j) m[i][j]=0;//没法裁剪
//if(i==j)长度为i的裁成i份,每一份都是1,那么m[i][j]=1
//if(i>j)  这才是我们要讨论的问题
//m[i][j]=max{m[i-k][j-1]*k}(1<=k<=i-j+1);
int main()
{
    int N,M;//N表示绳子的长度,M表示要剪成的段数
    cin>>N>>M;
    if(M>N){
        cout<<0;//每段绳子必须是整数,如果M>N,这个乘积为0
        return 0;
    }else if(N==M){
        cout<<1;//M=N,只有1种裁剪方法,每段绳子都是1,乘积也为1
        return 0;
    }else{
        //初始条件,用于迭代
        //长度为i的绳子裁成1段时,最大乘积为i
        for(int i=1;i<=N;i++)
            m[i][1]=i;
        //动态规划 i从1开始,j从2开始
        for(int i=1;i<=N;i++)
        for(int j=2;j<=M;j++){
            if(i==j)//只有1种裁剪方法,每段都是1
                m[i][j]=1;
            else if(i<j)//没有裁剪方法
                m[i][j]=0;
            else{//规划最优值
                int k=1;
                m[i][j]=m[i-1][j-1]*1;//m[i][j]赋初值
                //for循环更新m[i][j]
                for(k=1;k<=i-j+1;k++)//为保证每段小绳子长度>=1,1<=k<=i-j+1
                    if(m[i][j]<m[i-k][j-1]*k)
                        m[i][j]=m[i-k][j-1]*k;
            }
        }
    }
    cout<<m[N][M];
    return 0;
}
动态规划之割绳子 题目:给你一根长度为n的绳子,请把绳子剪成m段 (m和n都是整数,n&gt;1并且m&gt;1)每段绳子的长度记为k[0],k[1],…,k[m]. 请问k[0]k[1]…*k[m]可能的最大乘积是多少?例如,当绳子的长度为8时,我们把它剪成长度分别为2,3,3的三段,此时得到的最大乘积是18.思路:采用自底向上的动态规划方法。设f(n)代表长度为n的绳子剪成若干段的最大乘积,如果第一刀下去,第一... 阅读详情

相关推荐

动态规划之二:剪绳子问题

问题:现有一根长度为N的绳子,需要你剪成M段,使M段的乘积最大。(其中M、N都为整数,剪成的每段长度也为整数,N已知,M未知)例如 绳子长度N=8 剪成M=3,数值为别为2,3,3,则乘积最大为 2*3*3=18。 当我们遇到一个大规模问题时,总是习惯把问题的规模变小,这样便于分析讨论。我们从最简单的情况进行分析:当绳子的长度N=1时,我们至少需要剪绳子一次,这时乘积为0;当绳子的长度为N=2时,...

zjx_cfbx的博客 3503

【剑指Offer】剪绳子问题——四种解法

剪绳子问题——四种解法题目描述:输入描述:返回值描述:示例1:解题思路:方法1:暴力递归方法2:记忆化递归方法三:动态规划方法四,数学原理 题目描述: 给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],…,k[m]。请问k[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 输入描述: 输入一个数n(2<=n<=60) 返回

小哲的博客 4775

动态规划or贪心算法--剪绳子/切割杆

需求一:  剪绳子,将长度为n的绳子剪成若干段,求各段长度乘积的最大值 分析:  1、动态规划     设f(n)代表长度为n的绳子剪成若干段的最大乘积,如果第一刀下去,第一段长度是i,那么剩下的就需要剪n-i,那么f(n)=max{f(i)f(n-i)}。而f(n)的最优解对应着f(i)和f(n-i)的最优解,假如f(i)不是最优解,那么其最优解和f(n-i)乘积肯定大于f(n)的最优解,...

upupday19的博客 9552

190-剪绳子问题(两种方法)

题目如下: 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 示例 1: 输入: 2 输出: 1 解释: 2 = 1 + 1, 1 × 1 = 1 示例 2: 输入: 10 输出: 36 解释: 10 = 3 + 3 + 4, 3 × 3 ×

LINZEYU666的博客 800

动态规划之切割绳子

/* 切割绳子,每段绳子都有一个最大值,给定长度为n的绳子,如何切割让利益最大化 自底而上的方法,对于任何子问题,直至它依赖的所有子问题都解决,才会去解决它。 */ #include&lt;iostream&gt; #include&lt;algorithm&gt; #include&lt;vector&gt; using namespace std; vector&lt;int&...

坏鱼儿恋夏的博客 2011

JAVA算法:剪绳子获得最大乘积 — 动态规划

JAVA算法:剪绳子获得最大乘积 — 动态算法 给定一根长度为N米的绳子,以最大化所有部分长度的乘积的方式,将绳子切割成不同部分的整数长度。你必须至少切一刀。 假设绳索长度超过2米。 例如: 输入: n = 2 输出: 1 (获得的最大乘积是:1*1) 输入: n = 3 输出: 2 (获得的最大乘积是:1*2) 输入: n = 4 输出: 4 (获得的最大乘积是: 2*2) 输...

梅森上校的博客 业精于勤荒于嬉,形成于思毁于随。 1229

动态规划-剪绳子问题

题目 给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],…,k[m-1]。请问k[0]×k[1]×…×k[m]可能的最大乘积是多少? 例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 题目解析 首先题目描述并不是很清楚,我看了一下,比较准确的描述是,绳子分成m个部分,也就是m段。 默认的条件是 绳子不能不被分割,也就是至少被分为两个部分 m、n都是整数,n>1并且m&gt

工程师小星星 3058

广东电信兆能Z82盒子救砖记:手把手教你用U盘强刷HI3798MV100固件(附短接图)

本文详细介绍了广东电信兆能Z82盒子变砖后的救砖方法,重点讲解了使用U盘强刷HI3798MV100固件的全流程,包括诊断、准备工作、短接操作及刷机后的优化设置。特别针对m8233主板和8188无线方案的机型,提供了实用的短接图和操作技巧,帮助用户成功恢复设备。

weixin_30325487的博客 402

14.减绳子三种方法

题目描述 给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],…,k[m]。请问k[0]xk[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 输入描述: 输入一个数n,意义见题面。(2 <= n <= 60) ...

107 9879

手把手教你用Cesium和RayMarching实现逼真体积云(附完整Shader代码)

本文详细介绍了如何利用Cesium和RayMarching技术实现逼真的体积云效果,包括环境准备、核心逻辑、云层建模和光照增强等关键步骤,并提供了完整的Shader代码。通过噪声函数选型、动态风场模拟和多重散射近似等技术,开发者可以在数字地球可视化项目中创建沉浸式天气效果,显著提升场景的真实感。

weixin_29230649的博客 415

UG476 GT Transceivers文档翻译和自身理解

对UG476 Xilinx官方文档进行翻译的基础上加上自己的理解

weixin_45143788的博客 4598

减绳子

给你一根长度为n的绳子,请把绳子剪成m段 (m和n都是整数,n&gt;1并且m&gt;1)每段绳子的长度记为k[0],k[1],…,k[m]。请问k[0]k[1]…*k[m]可能的最大乘积是多少?例如,当绳子的长度为8时,我们把它剪成长度分别为2,3,3的三段,此时得到的最大乘积是18。 动态规划 首先定义函数f(n)为把长度为n的绳子剪成若干段后各段长度乘积的最大值。在剪第一刀时,我们有n-...

sifanchao的博客 863

嵌入式STM32F407CET6移植OpenHarmony系统方法

文件末尾添加:export PATH=~/gcc-arm-none-eabi-10-2020-q4-major/bin:$PATH。编译完成文件输出在LiteOs源码目录下out/STM32F407_ATK_Explorer文件夹中。②点击connect to the target,下方会自动显示识别出来的芯片型号以及flash大小。⑤点击program verify并点击start,等待烧写并校验完成,你就能看到程序正在运行了。,在选择刚才我们说的Huawei_LiteOS.hex文件。

嵌入式技术开发 546

一刷316-剑指 Offer 14- II. 剪绳子 II(m)(同:343. 整数拆分)

题目: 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1), 每段绳子的长度记为 k[0],k[1]...k[m - 1] 。请问 k[0]*k[1]*...*k[m - 1] 可能的最大乘积是多少? 例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。 --------- 示例: 输入: 2 输出: 1 解

唐宋元明清的博客 256

游戏战斗系统架构设计的演绎之路——从一坨意大利面条到一座精密钟表

摘要:游戏战斗系统架构设计的演进之路 本文系统梳理了游戏战斗系统从早期街机到现代3A大作的架构发展历程。70-80年代的街机游戏采用基础碰撞盒判定(如《街头霸王》);90年代实现动画融合与状态机架构(《最终幻想》《拳皇》);2000年后MMO引入服务器验证与同步技术(《魔兽世界》);3D时代融合物理引擎与智能AI(《GTA5》《只狼》);移动端则发展出轻量化架构与云端判定(《王者荣耀》)。现代战斗系统已实现模块化、数据驱动和热更新,未来趋势是AI裁判与云战斗系统。这一演进过程展现了技术与创意的完美结合,数百

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 800

高温环境下(100℃以上)相机的几种保障方案

高温环境下相机保障措施摘要:针对120℃以上高温环境,相机需采取多重防护:1.散热设计采用金属机身、散热鳍片或风扇;2.关键部件选用耐高温材料(铝合金、特种玻璃);3.电子元件需军规级芯片并做三防处理;4.建议外接电源或耐高温电池。工业相机(如FLIR A655sc、Basler ace)及特种机型(Ximea xiQ)具备高温适应性,普通相机可加装隔热套件配合冷却系统。选择时需关注传感器信噪比和全局快门性能,并设置温度监控保护机制。注意高温会加速设备老化,需定期检测维护。(149字)

start_up_go的博客 1585

动态规划算法(斐波那契数列,剪绳子问题)

记录学习的动态规划算法。 1.理论理解: 基本思想 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法...

weixin_45405425的博客 1087

大模型自我认知微调的实战教程

本文主要介绍了大模型自我认知微调的实战教程,希望对学习大语言模型的同学们有所帮助。微调成功并保留原有能力的截图如下所示: 文章目录 1. 前言 2. 配置环境 2.1 安装虚拟环境 2.2 安装依赖库 3. 实战代码 3.1 配置数据集 3.2 lora微调

herosunly的博客 4万+

【算法】【动态规划篇】第5节:剪绳子问题

本期任务:介绍算法中关于动态规划思想的几个经典问题 【算法】【动态规划篇】第1节:0-1背包问题 【算法】【动态规划篇】第2节:数字矩阵问题 【算法】【动态规划篇】第3节:数字三角形问题 【算法】【动态规划篇】第4节:硬币找零问题 【算法】【动态规划篇】第5节:剪绳子问题 一、问题描述 """ 剪绳子问题 给你一根长度为N的绳子,请把绳子剪成M段(m,n都是整数),每段绳...

weixin_43868754的博客 1279

[机器学习] 第二章 模型评估与选择 2.ROC:roc_curve原理及源代码详解

代码见:https://github.com/Carrie-Yi/machine_learning/tree/main/roc_curve

心宝的博客 1493

NTscan扫描工具

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

剪绳子问题-动态规划

给你一根长度为n的绳子,请把绳子剪成m段(m,n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],...,k[m]。请问k[m]可能的最大乘积是多少?例如,当绳子的长度为8时,我们把它剪成长度分别是2、3、3的三段,此时得到的最大的乘积是18. 可以把大问题分解成几个小问题,分解后每个小问题也存在最优解,如果把小问题的最优解组合起来能够得到整个问题的最优解,我们可以...

Hanoch_wang的博客 1377

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

动态规划&贪婪算法之剪绳子

动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。 1. 可以使用动态规划的情形: (1)在应用动态规划之前,要分析能否把大问题分解成小问题,分解后的小问题也存在最优解;如果把小问题的最优解组合起来能够得到整个问题的最优解,那么就可以应用动态规划解决这个问题。 (2)如果是求一个问题的最优解(通常是求最大值或者最小值),而且该问题能...

H_Expect的博客 1076

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

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

剑指offer之剪绳子问题

1 问题 给你一根长度为n的绳子,请把绳子剪成m段 (m和n都是整数,n>1并且m>1)每段绳子的长度记为k[0],k[1],…,k[m]. 请问k[0] * k[1] …k[m]可能的最大乘积是多少? 例如,当绳子的长度为8时,我们把它剪成长度分别为2,3,3的三段,此时得到的最大乘积是18. 2 分析 1) 分析边界值 n和m题目说了,要求大于1,所以...

码莎拉蒂 2883

剪绳子问题(动态规划,贪婪,递归)

给你一根长度为n的绳子,请把绳子剪成m段(m、n都是整数,n>1并且m>1), 每段绳子的长度记为k[0],k[1],...,k[m]。请问k[0]xk[1]x...xk[m]可能的最大乘积是多少? 例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 思路 注意 当长度大于3 f[n]才能得到绳子的最大乘积 动态规划 特征 从上往下分...

asdsadasd1985的博客 603

剪绳子的几种解法 — C++实现

文章目录题目描述求解思路1:求解代码求解思路2:求解代码 题目描述 求解思路1: 求解代码 求解思路2: 求解代码

Jeaten 1323

深入解析剪绳子问题:动态规划与数学方法

剪绳子问题(剑指 Offer 14-I)是一个经典的算法问题:给定一根长度为 n 的绳子,要求将其剪成 m 段(m、n 都是整数,n>1 且 m>1),每段绳子的长度记为 k[0], k[1], ..., k[m-1]。目标是找到这些段长度的乘积最大值。 **示例:** - 输入:2 → 输出:1(2 = 1 + 1,1 × 1 = 1) - 输入:10 → 输出:36(10 = 3 + 3 +

gitblog_00306的博客 704
上一篇: 算法训练 数的划分
下一篇: 布线问题分支界限法求解
practical_sharp
博客等级 码龄8年 499粉丝 148原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值