首页 > 编程语言 >C/C++ 数据结构五大核心算法之动态规划算法-给你一根长度为 n 的金条,请把金条剪成 m 段 (m 和 n 都是整数,n>1 并且 m>1)每断金条的长度记为 k[0],k[1],…,

C/C++ 数据结构五大核心算法之动态规划算法-给你一根长度为 n 的金条,请把金条剪成 m 段 (m 和 n 都是整数,n>1 并且 m>1)每断金条的长度记为 k[0],k[1],…,

时间:2023-08-03 11:22:19浏览次数:39  
标签:问题 乘积 long 金条 算法 长度

动态规划也是一种分治思想,但与分治算法不同的是,分治算法是把原问题分解为若干子问题,自顶向下,求解各子问题,合并子问题的解从而得到原问题的解。动态规划也是自顶向下把原问题分解为若干子问题,不同的是,然后自底向上,先求解最小的子问题,把结果存储在表格中,在求解大的子问题时,直接从表格中查询小的子问题的解,避免重复计算,从而提高算法效率。 什么时候要用动态规划? 如果要求一个问题的最优解(通常是最大值或者最小值),而且该问题能够分解成若干个子问题, 并且小问题之间也存在重叠的子问题,则考虑采用动态规划。 怎么使用动态规划? 1. 判题题意是否为找出一个问题的最优解 2. 从上往下分析问题,大问题可以分解为子问题,子问题中还有更小的子问题 3. 从下往上分析问题 ,找出这些问题之间的关联(状态转移方程) 4. 讨论底层的边界问题 5. 解决问题(通常使用数组进行迭代求出最优解) 例题:给你一根长度为 n 的金条,请把金条剪成 m 段 (m 和 n 都是整数,n>1 并且 m>1)每断金条的长度记为 k[0],k[1],…,k[m].请问 k[0] k[1]…*k[m]可能的最大乘积是多少? 思路:1.首先,根据题意我们可以知道金条的长度和段数都要大于1,也就是说段数要从2开始;2.又因为金条的长度和段数都是整数,所以段数的范围是2~n,比如一根10cm的金条,最多能分成10段,每段1cm;3.接下来我们找找关联的子问题,当金条的长度小于2时,无法继续划分,最大的乘积返回0;当金条的长度为2时,可分为2段,每段的长度为1,最大的乘积即为1;当金条的长度为3时,可分为2段,一段长度为1,一段长度为2,最大的乘积即为2;4.最后我们来找找当金条长度大于3时的最大的乘积有何规律。

#include <iostream>
#include <Windows.h>
using namespace std;
long long getMaxMul(int n) {
    if (n < 2) return 0;
    if (n == 2) return 1;
    if (n == 3) return 2;
    long long * k = new long long[n+1];
    k[0] = 0;
    k[1] = 1;
    k[2] = 2;
    k[3] = 3;
    for (int i = 4; i <= n; i++) {
        long long max = 0;
        for (int j = 1; j <= i / 2; j++) {
            long long ret = k[j] * k[i-j];
            if (max < ret) {
                max = ret;
            }
        }
        k[i]=max;
    }
    return k[n];
    delete[] k;
}
int main() {
    int n = 0;//n为金条长度
    cout << "请输入金条的长度:";
    cin >> n;
    cout << "可能的最大乘积是:" << getMaxMul(n) << endl;
    
    system("pause");
    return 0;
}

标签:问题,乘积,long,金条,算法,长度
From: https://www.cnblogs.com/smartlearn/p/17602798.html

相关文章

  • JavaScript学习 -- RSA算法应用实例及公钥私钥的生成方法
    正文:RSA算法是一种非对称加密算法,用于加密、解密和数字签名等场景。本文将介绍如何在JavaScript中使用RSA算法,并提供一个实际的案例,同时也会说明如何生成公钥和私钥。首先,确保您已经引入了jsencrypt库。以下是一个使用RSA算法进行加密和解密的示例,同时也包含了公钥和私钥的生成方法......
  • 算法-13-堆排序
            ......
  • 算法-10--python shuffle函数_python中shuffle()方法的功能详解
     pythonshuffle函数_python中shuffle()方法的功能详解: python的概率分布中,洗牌算法是通过shuffle()方法实现的,shuffle()方法将列表的所有元素打乱,随机排列。Python既可以使用random.shuffle对列表进行洗牌,也可以使用random.shuffle随机播放字符串列表,本文向大家介绍python中......
  • 算法-09-插入排序
       ......
  • yolov5 算法环境(GPU CPU)搭建与使用(windows环境)
    文章目录前言前提说明一、环境搭建1.1、GPU环境Anaconda安装CUDA安装CUDNN安装(可不装,加速深度学习用途)二、项目启动2.1、构建yolov5环境2.2、实战深度学习预测示例1:预测图片示例2:预测视频上面案例过程中的问题1、CUDA不匹配当前GPU的版本(卸载重装)2、重新安装pyotrch版本2.3、训练模......
  • 数据结构与算法
    链表链表跟数组关系密切,首先你要理解数组是一块连续的内存地址,把数据放进去。但是他有个不好就是不适合去做增删改查,进行移除或增加操作时,往往非常繁琐,相当于要改变整个数组,因此呢!链表就应用而生,给在存放每一个数据,同时给这个数据指向它后一个数据(链表分为指针域和数据域),且不在是储......
  • m基于大规模MIMO技术的5G网络上下行功率优化算法matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:      2.算法涉及理论知识概要         基于大规模MIMO技术的5G网络上下行功率优化算法"是针对5G网络中的大规模多输入多输出(MIMO)系统进行功率优化的一种算法。该算法旨在通过优化上行和下行通信的功率分配,以......
  • 基于蜉蝣优化算法实现聚类附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 采用PCA算法&KMeans算法来实现用户对物品类别的喜好细分(菜篮子分析)(附带数据集下载)
    实现该项目的流程如下"""项目:用户对物品类别的喜好细分(菜篮子分析)主算法:PCA降维算法KMeans算法总思路1、导包2、获取数据3、数据处理5、特征工程(使用PCA降维)6、使用KMeans算法进行模型训练7、模型评估""" Firstofall!!导包......
  • 算法-06-冒泡排序
       importrandomdefbubble_sort(li):foriinrange(len(li)-1):forjinrange(len(li)-i-1):ifli[j]>li[j+1]:li[j],li[j+1]=li[j+1],li[j]li=[random.randint(0,20)foriinrange(15)......