钢条切割(dp解法)

2023-11-09

1. 问题描述:

Serling公司购买长钢条,将其切割为短钢条出售。切割工序本身没有成本支出。公司管理层希望知道最佳的切割方案。
假定我们知道Serling公司出售一段长为i英寸的钢条的价格为pi(i=1,2,…,单位为美元)。钢条的长度均为整英寸。

| 长度i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| - | - | - | - | - | - | - | - | - | - |
价格pi | 1 | 5 | 8 | 16 | 10 | 17 | 17 | 20 | 24 | 30 |

钢条切割问题是这样的:给定一段长度为n英寸的钢条和一个价格表pi(i=1,2,…n),求切割钢条方案,使得销售收益rn最大。
注意,如果长度为n英寸的钢条的价格pn足够大,最优解可能就是完全不需要切割

2. 最优解的问题我们可以使用多种方法来解决,可以使用普通的递归深度优先搜索记忆型的递归,还有就是我们可以使用动态规划dp来进行解决,使用动态规划所消耗的时间是最少的,代码的性能最好,但是一开始的时候我们可能对于动态规划不是特别熟悉,那么这个时候就需要把前面的普通递归,深度优先搜索,记忆型的递归来先熟悉好,把那些代码先写一遍然后再写动态规划的代码,这样对于自身的提高会很多,增加对于动态规划的理解

3. 使用动态规划来进行求解,最重要的是要搞清楚参数的变化,涉及到因变量,自变量的变化,类似于函数,由自变量的变化引起因变量的变化,确定好变化的量之后,对于这道题目来说是变化的量是可以切割的钢条的长度,因变量是最大价值

对于动态规划来说,因变量一般是保存的最优的解或者最优的方案,这里是切割钢条的最大价值

那么我们便可以使用excel表格来进行dp公式的推导:

假如因变量长度我们想的是:保留的钢条的长度,对于长度为0我们保留0说明我们要把这条钢条全部切割但是切割10的最佳方案正是我们需要求解的,所以这种想法无法继续下去,需要换一种思考方式,我们可以这样想:假如我们有长度为0,1,2,3...10

的钢条我们要怎么样进行切割才可以使到我们价值最大呢?例如我们有长度为2的钢条我们可以这样切:

0----2型的切割

1----1型的切割

2----0型的切割

前面的为保留的钢条的长度,剩下的为长度为n切割的最佳方案,前面的保留的长度可以直接查从控制台输入的相关的值,那么剩下的为长度为n切割的最佳方案可以查询之前历史上保存的剪切的最佳切割方案,对于长度为2的钢条,1----1型的切割后面1的最佳方案前面已经求解出来了直接查询就可以了,把excel表格填完之后就可以发现这个规律了

我们也可以这样想:我们当前有长度为n的钢条,我们每次可以切的多个组合中求解出最大值,所以来说其实是在多个组合中选择一个最大价值的问题

3. 具体的代码如下:

import java.util.Scanner;
import static java.lang.Math.max;
public class Main{
    static int rec[];
    public static void main(String[] args) {
        //下面使用动态规划来进行解决,关键是要求出变化的量在哪里,我们可以使用excel表格来进行打表帮助我们更好地理解
        //以便求出最佳的切割方案
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int v[] = new int[n];
        for(int i = 0; i < n; i++){
            v[i] = sc.nextInt();
        }
        dp(v, n);
        sc.close();
    }
    private static void dp(int[] v, int n){
        rec = new int[n + 1];
        for(int i = 1; i < n + 1; i++){
            for(int j = 1; j <= i; j++){
                //前面的是保留的是整对的长度,后面的是需要切割钢条的剩余长度的最佳切割方案
                rec[i] = max(v[j - 1] + rec[i - j], rec[i]);
            }
        }    
                System.out.println(rec[n]);
    }
}

 测试数据:

10 1 5 8 16 10 17 17 20 24 30  输出37

10 1 4 2 3 5 6 2 3 1 6                  输出20
10 1 1 4 2 3 1 6 3 2 1                  输出13

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

钢条切割(dp解法) 的相关文章

  • anaconda python3.8目录_Linux系统下Anaconda的安装和使用教程

    一 Anaconda的安装 去官网下载 https www anaconda com products individual 下载到本地后利用FileZilla软件上传到服务器 我这里上传到了 data bioinfosoftware文件夹
  • vcpkg编译第三方库leveldb

    vcpkg编译leveldb 1 安装vcpkg 使用git命令直接pull vcpkg源码 git clone https github com microsoft vcpkg 2 在vcpkg目录执行bootstrap vcpkg ba
  • Android 之 intent内容解析

    文章目录 intent intent 属性 1 Action 匹配规则 Action匹配只要有一个与Intent中携带Action相同即可 2 Category 注意 3 Data 4 Component 5 Type 6 Extras 存
  • DirectShow音视频同步实验报告(2)

    单一视频流 Filter Graph如图2 图2 单一视频流的Filter Graph 注意 紧靠Video Renderer的上一级Filter的Video输出Pin 其GetMediaType函数提供的Media Type的VIDEOI
  • CMake学习之set

    文章目录 一 set关键字 二 变量的使用 一 set关键字 将一个cmake变量设置为给定值 将变量
  • 搭建jupyter notebook,开启线上IDE学习

    一 windows搭建jupyter notebook 在jupyter notebook中利用本地虚拟环境 1 激活本地虚拟环境 activate py36 安装nb conda conda install nb conda 3 在ana
  • 发布一套很有本土特色的闽南语QQ表情

    发布一套很有本土特色的闽南语QQ表情 作为福建本地人 对闽南语在熟悉不过了 平时朗朗上口的俗话 现在演变成活泼可爱有趣的QQ表情咯 大家喜欢的话可以来收藏 底下有QQ表情导入包 直接导入QQ即可使用了
  • 如何安装EasyX图形库

    如何下载 1 打开EasyX官网点我 应该是这样子的 2 点击 下载 EasyX 在图片的右边 找不到算你眼瞎 3 直接打开安装包 4 下一步 来到选择界面 5 点击安装 EasyX文档也可以安装一下 但下面的必须点一个 6 点击关闭 结束
  • 服务器运维基础知识,运维技术必须了解的服务器基础知识

    小影提醒 文章部分内容源于互联网收集整理 不代表影速观点 若有咨询 运维技术必须了解的服务器基础知识 等有关服务器 云主机租用 托管 配置 价格问题 请随时咨询影速科技客服 享受1v1贴心服务 1 双路等于双核么 常听说双路至强XX式服务器
  • Spring Boot单元测试

    目录 什么是单元测试 单元测试的好处 单元测试的实现 断言 修改操作 删除操作 添加数据 返回受影响的行数 返回自增id 什么是单元测试 是指对软件中的最小可测试单元进行检查和验证的过程 单元测试的好处 可以非常简单 直观 快速的测试某一个
  • 模块化 组合化_一流的组合模块系统

    模块化 组合化 这是本系列的第二篇文章 介绍了用于组合的反转控制类型系统 本文讨论了比上一篇文章的 一流过程类型 更通用的 模块类型 系统 注意 某些功能性编程语言也尝试定义一流模块 本文定义的First Class Modules是从反向
  • 前端基础学习之Sass

    一 概念 1 Sass是什么 Sass 英文全称 Syntactically Awesome Stylesheets 是一个最初由 Hampton Catlin 设计并由 Natalie Weizenbaum 开发的层叠样式表语言 Sass
  • AI读天涯神贴----人,应该怎么活

    接着上一期AI读天涯神贴 开悟其实很简单 这期我们来用AI读另外一篇神帖 人 应该怎么活 下面是帖子中的一些节选 老家有句话 叫春天戳一棍 秋天吃一顿 意思是 春天用个棍子在地上捅个窟窿 扔进种子 那秋天就有可能因此吃上一顿的果实 春天 这
  • Prometheus - SSL 证书过期监控

    目录 一 环境 二 部署 Exporter 2 1 配置 blackbox exporter 2 2 配置 Prometheus 2 3 Grafana 监控面板 一 环境 数据采集 Exporter blackbox exporter V
  • Java实现登录[数据库]

    和上篇的随机点名系统一样 都是使用MySQL数据库来实现 因为刚学所以写点简单例子满足下自己 需求分析 1 输入用户名和密码 2 与数据库中的记录进行比较 原理比较 简单 直接贴代码吧 import java sql Connection
  • 黑马点评给店铺类型查询业务添加缓存(List实现)

    代码如下 public Result queryShopTypeList String key CACHE SHOP TYPE KEY List 1 从Redis中查询店铺类型 获取所有 List
  • 红黑树

    1 概念 红黑树是一种近似平衡的二叉搜索树 在每个结点上增加一个存储位表示结点的颜色 可以是Red或Black 通过对任何一条从根到叶子的路径上各个结点着色方式的限制 红黑树确保没有一条路径会比其他路径长出两倍 因而是接近平衡的 2 性质
  • 多项式回归的matlab实现

    一次函数的线性回归 首先我们回顾一下当回归函数为一次函数的情况 存在训练样本矩阵 X 该矩阵大小为m n 其中m为样本数量 n为特征数量 此时回归方程为 其中为系数向量 此时代价函数为 当代价函数取得最小值时 为最优解 对进行求导得到
  • Navicat使用教程:在Navicat Monitor for MySQL/MariaDB中配置实例

    下载Navicat Monitor最新版本 Navicat Monitor是一套安全 简单而且无代理的远程服务器监控工具 它具有强大的功能使你的监控发挥最大效用 受监控的服务器包括 MySQL MariaDB 和 Percona Serve

随机推荐

  • Nvidia RTX A4000 GPU 安装 515驱动记录-Ubuntu22.04

    The record of Nvidia driver installation of Nvidia RTX A4000 in ubuntu22 04 Environment Ubuntu22 04 GPU Nvidia RTX A4000
  • pytorch官方demo(LeNet)——model篇

    前言 以下文章均为学习笔记 目的是加强自己的记忆 同时希望帮助更多的学习者理解视频中的内容 是跟着一位优秀的b站up主霹雳吧啦Wz学习的 附上视频链接 2 1 pytorch官方demo Lenet 哔哩哔哩 bilibili 另外笔记是参
  • 第2章第2节练习题3 使用队列模拟渡口管理

    问题描写叙述 汽车轮渡口 过江渡船每次能载10辆车过江 过江车分为客车和货车类 上渡船有例如以下规定 1 同类车先到先上船 2 客车先于货车上渡船 其每上4辆客车 才同意放上一辆货车 3 若等待客车不足4辆 则以货车取代 4 若无货车等待
  • 利用SimpleDateFormat或者LocalDateTime生成格式为“yyyy-MM-dd HH:mm:ss“的当前时间

    java程序 利用LocalDateTime生成格式为 yyyy MM dd HH mm ss 的当前时间 DateTimeFormatter formatter DateTimeFormatter ofPattern yyyy MM dd
  • CSS3属性之text-overflow:ellipsis

    语法 text overflow clip ellipsis 默认值为clip 不显示省略标记 clip 当前对象内文本溢出时不显示省略标记 而是将溢出部分裁剪 ellipsis 当对象内文本一处时显示省略标记 一 常见的单行文本溢出显示省
  • STM32微控制器综合实训10 基于CAN总线的超声波测距仪设计实验

    实验10 基于CAN总线的超声波测距仪设计实验 利用CAN总线来实现数据的传送 文章目录 代码讲解 c8t6 温度传感器ds18b20 超声波测距 main c中的while CAN通信 代码讲解 zet6 main c 总结 代码讲解 c
  • IDEA pom.xml依赖版本号报错

    自我问题解决记录 折腾了一上午终于解决 我先按照其他解决方法都试过 没有任何反应 大家还是可以试试 1 修改maven版本号 重新下载旧版本并配置环境变量 并装了cleanLastUpdated bat小脚本去清除没有下载成功 完全的包 没
  • UC3843驱动BOOST升压电路

    充能模块通过一个UC3843芯片控制BOOST升压电路实现 由于电磁炮的发射能量与电容上储存的能量存在正相关 电容上储存的能量由于电容的容值正相关 因此本系统需要选择较大的电解电容 在实际的过程中选择了2个470uF 450V的电容进行并联
  • 【刷题】华为笔试面试机考 [HJ5] - 进制转换

    题目地址 点击跳转 题目描述 写出一个程序 接受一个十六进制的数 输出该数值的十进制表示 输入描述 输入一个十六进制的数值字符串 注意 一个用例会同时有多组输入数据 请参考帖子https www nowcoder com discuss 2
  • GAMES101-现代计算机图形学学习笔记(4)作业3

    前言 上篇作业2 本篇将更新作业3相关内容 作业3相关链接 games的作业3链接 我的源码 作业3简述 插值计算 各种shader实现 作业3相关知识笔记 Barycentric Coordinates Blinn Phong Lambe
  • 开源大数据工具汇总

    查询引擎 一 Phoenix 贡献者 Salesforce 简介 这是一个Java中间层 可以让开发者在Apache HBase上执行SQL查询 Phoenix完全使用Java编写 代码位于GitHub上 并且提供了一个客户端可嵌入的JDB
  • gRpc入门

    gRpc 一 简介 1 gprc概念 gRpc是有google开源的一个高性能的pc框架 Stubby google内部的rpc 2015年正式开源 云原生时代一个RPC标准 tips 异构系统 就是不同编程语言的系统 2 grpc核心设计
  • 解决docker在CentOs7中安装好运行不了问题

    用yum方式安装docker遇到错误的以下问题 Docker 无法启动 root localhost 桌面 yum update root localhost 桌面 yum install docker root localhost 桌面
  • Java复习-20-接口(2)- 工厂设计模式

    工厂设计模式 Factory 观察如下例子 食物接口 所有食物都应该能够食用 但食用方式不同 因此包含抽象方法 eat 面包子类 实现食物接口 实现接口中的 eat 方法 吃面包 牛奶子类 实现食物接口 实现接口中的 eat 方法 喝牛奶
  • 方法(函数)数组

    方法 函数 数组 概念 方法 也叫函数 但是一般在java中都叫方法 可以看成是一个可以完成独立功能的代码块 可以反复使用 每次使用都是独立的 存在于类的结构体 作用 完成功能 数据的处理 方法可以拿来反复使用 每次使用都是独立的 publ
  • 构建更加灵活的IIoT解决方案

    Softing的dataFEED系列edgeConnector产品现在支持MQTT subscriber功能 从而支持与物联网云或物联网边缘应用的双向通信 Softing edgeConnector产品的新版本2 31现在支持MQTT su
  • Bootstrap的基本使用方法,5分钟帮你搞懂怎么用

    作为Coder 我们都接触过Web design 如何快速的构建Web应用成了我们比较头疼的一个问题 不仅要考虑各种浏览器的兼容性 同时还要考虑各种手机的页面适配 毕竟现在已经到了互联网手机满天飞的时代了 我有会听嵩哥的歌 对 唱歌的那位
  • 【转载】VB滚轮插件(win7 64位)

    在五楼的时候电脑里的VB都已经预装好了滚轮插件了 这次下四楼用自己的电脑才发现那么一个小小的东西真心很方便 想安装一个 按照网上的教程发现了一点点小问题 最后当然完美解决啦 分享一下 已经知道的童鞋呢 忽略就好啦 首先 请看一篇转帖 看不看
  • GPT3.5 VS GPT-4写领导讲话稿,谁是最强笔杆子?

    正文共 1240 字 阅读大约需要 5 分钟 文秘 公务员必备技巧 您将在5分钟后获得以下超能力 快速生成领导讲话稿 Beezy评级 B级 经过简单的寻找 大部分人能立刻掌握 主要节省时间 推荐人 Kim 编辑者 Linda 图片由Lexi
  • 钢条切割(dp解法)

    1 问题描述 Serling公司购买长钢条 将其切割为短钢条出售 切割工序本身没有成本支出 公司管理层希望知道最佳的切割方案 假定我们知道Serling公司出售一段长为i英寸的钢条的价格为pi i 1 2 单位为美元 钢条的长度均为整英寸