华为OD机试 - 伐木工 - 动态规划(Java 2024 E卷 200分)

news2025/1/11 21:06:33

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)》。

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

一根X米长的树木,伐木工切割成不同长度的木材后进行交易,交易价格为每根木头长度的乘积。规定切割后的每根木头长度都为正整数;也可以不切割,直接拿整根树木进行交易。

请问伐木工如何尽量少的切割,才能使收益最大化?

二、输入描述

木材的长度(X ≤ 50)

三、输出描述

输出最优收益时的各个树木长度,以空格分隔,按升序排列

四、测试用例

测试用例1:

1、输入

10

2、输出

3 3 4

3、说明

  • 一根2米长的树木,伐木工不切割,为2 * 1,收益最大为2。
  • 一根4米长的树木,伐木工不需要切割为2 * 2,省去切割成本,直接整根树木交易,为4 * 1,收益最大为4。
  • 一根5米长的树木,伐木工切割为2 * 3,收益最大为6。
  • 一根10米长的树木,伐木工可以切割方式一:3, 4, 3, 也可以切割为方式二:3, 2, 2, 3,但方式二伐木工多切割一次,增加切割成本却买了一样的价格,因此并不是最优收益。

测试用例2:

1、输入

5

2、输出

2 3

3、说明

长度为5的木材,最优切割方案是将其切割成两段:长度为2和3。

方案1:5 = 2 + 3,收益为 2 × 3 = 6,切割次数为1。

其他切割方案如:5 = 1 + 4 或 5 = 5,都无法获得更高的收益。

因此输出结果为 2 3,代表最优收益的木材切割长度。

五、解题思路

1、动态规划

题目要求通过切割木材来最大化收益,这属于动态规划问题。

动态规划的状态定义为:dp[i] 记录长度为 i 的木材的最大收益及其切割方案。

通过遍历所有可能的切割点,并比较不同的切割方案来更新 dp 表,从而得到最终的最优解。

2、具体解题步骤:

  1. Wood 类定义了每段木材的最大收益 maxProfit 和对应的切割方案 cutLengths。
  2. 对于每一段长度 i 的木材,初始情况下不切割的最大收益是 i,并将它添加到 cutLengths 列表中。
  3. 外层循环 currentLength 遍历所有可能的木材长度,内层循环 cutPosition 通过尝试所有可能的切割位置计算木材的最大收益。如果新的切割方案的收益更高,或者收益相同但切割次数更少,更新动态规划数组 dp。
  4. 最后对得到的最优切割方案进行升序排列,并输出。

3、核心算法(动态规划思路):

  1. 对于长度为 i 的木材,遍历所有可能的切割点 j(从1到 i-1),考虑将木材切割成两段 j 和 i-j 的情况,计算切割后的总收益:newProfit = dp[j].profit * dp[i - j].profit
  2. 如果 newProfit 比 dp[i].profit更大,或者收益相同但切割次数更少(切割次数由 slices.size() 来衡量),则更新 dp[i]:
  3. 更新 dp[i].profit 为 newProfit
  4. 更新 dp[i].slices 为 dp[j].slices 与 dp[i - j].slices的合并。

六、Java算法源码

public class OdTest01 {
    // 定义Wood类,用于记录最大收益和对应的切割方案
    static class Wood {
        int maxProfit; // 最大收益
        ArrayList<Integer> cutLengths = new ArrayList<>(); // 对应的切割方案
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int woodLength = scanner.nextInt(); // 输入木材的总长度

        Wood[] dp = new Wood[woodLength + 1]; // 动态规划数组,记录每个长度木材的最大收益和切割方案

        // 初始化动态规划数组,每个长度的木材初始收益为不切割时的收益
        for (int i = 0; i <= woodLength; i++) {
            dp[i] = new Wood();
            dp[i].maxProfit = i;
            dp[i].cutLengths.add(i);
        }

        // 动态规划计算每个长度木材的最大收益及其切割方案
        for (int currentLength = 2; currentLength <= woodLength; currentLength++) {
            for (int cutPosition = 1; cutPosition < currentLength; cutPosition++) {
                int newProfit = dp[cutPosition].maxProfit * dp[currentLength - cutPosition].maxProfit;

                // 如果当前切割方案的收益更大,或者收益相同但切割次数更少,则更新切割方案
                if (newProfit > dp[currentLength].maxProfit
                        || (newProfit == dp[currentLength].maxProfit
                        && dp[currentLength].cutLengths.size() > dp[cutPosition].cutLengths.size() + dp[currentLength - cutPosition].cutLengths.size())) {
                    dp[currentLength].maxProfit = newProfit;
                    dp[currentLength].cutLengths.clear();
                    dp[currentLength].cutLengths.addAll(dp[cutPosition].cutLengths);
                    dp[currentLength].cutLengths.addAll(dp[currentLength - cutPosition].cutLengths);
                }
            }
        }

        // 对最终的切割方案进行升序排序
        dp[woodLength].cutLengths.sort(Integer::compareTo);

        // 打印最终的切割方案
        StringJoiner result = new StringJoiner(" ");
        for (int length : dp[woodLength].cutLengths) {
            result.add(Integer.toString(length));
        }

        System.out.println(result);
    }
}

七、效果展示

1、输入

17

2、输出

2 3 3 3 3 3

3、说明

对于长度为17的木材,最优的切割方案是将其切割成六段:一段长度为2,其余五段长度为3。

方案:17 = 2 + 3 + 3 + 3 + 3 + 3,收益为 2 × 3 × 3 × 3 × 3 × 3 = 486,切割次数为5。

为什么选择这种切割方式:

  1. 收益最大化:切割成长度为2和3的组合时,乘积收益达到最大值。这个组合虽然在长度上比较均衡,但相乘的结果是最大的。
  2. 切割次数较少:通过5次切割就可以将木材分割成6段,得到了最大的收益值。

其他可能的切割方案,例如长度为1的切割,或者长度更大的组合(如4或5),都不会提供比上面组合更大的收益。

因此,最终输出为 2 3 3 3 3 3,代表最大收益的木材切割长度。

在这里插入图片描述


🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 E卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2131371.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

可以实时引入模块

缺点&#xff1a;循环会有点问题,不能死循环,最好在python脚本中起一个计时器 解释器在执行时时同步的,所以会见界面卡住,使用多个线程可以解决这个问题 或者使用 C的异步 一个完整的IDLE 麻烦,得把pyshell.py 弄能才能从tk 改到qt 内嵌到 dock

三维坐标变换

&#xff08;一些困惑梳理记录&#xff09; “坐标转换”的区分 1、坐标系基底变换 2、目标描述向量变换 总的来说&#xff0c; A属于1、坐标系基底变换&#xff0c; B中所述方法&#xff0c;可用于1、坐标系基底变换&#xff0c;也可用于2、目标描述向量变换&#xff0c…

文生视频算法

文生视频 Sora解决问题&#xff1a;解决思路&#xff1a; CogVideoX解决问题&#xff1a;解决思路&#xff1a; Stable Video Diffusion&#xff08;SVD&#xff09;解决问题&#xff1a;解决思路&#xff1a; 主流AI视频技术框架&#xff1a; Sora Sora: A Review on Backg…

SpringBoot项目请求返回json空字段过滤

接口返回的json中有的字段可能是为空的&#xff0c;我们不希望他为空的还返回&#xff0c;如下例子&#xff1a; 解决方案&#xff1a;只需要加一个配置类就行&#xff1a; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.Dese…

【每日刷题】Day120

【每日刷题】Day120 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 413. 等差数列划分 - 力扣&#xff08;LeetCode&#xff09; 2. 978. 最长湍流子数组 - 力扣&…

知识图谱增强在 360 文档知识问答及管理中的应用实践

主要内容包括以下几大部分&#xff1a; 360 文档云知识管理/问答应用场景 KG 在文档 RAG 问答中的应用 KG 在文档标准化、层次化、结构化应用 KG 与 LLM 在文档场景下的挑战及展望 问答环节 01 360 文档云知识管理/问答应用场景 首先来介绍一下 360 文档云知识管理问答的…

K1计划100%收购 MariaDB; TDSQL成为腾讯云核心战略产品; Oracle@AWS/Google/Azure发布

重要更新 1. 腾讯全球数字生态大会与9月5日-6日举行&#xff0c;发布“5T”战略&#xff0c;包括TDSQL、TencentOS、TCE&#xff08;专有云 &#xff09;、TBDS&#xff08;大数据&#xff09;、TI &#xff08;人工智能开发平台&#xff09;等 ( [2] ) ; 并正式向原子开源基金…

【无人机设计与控制】基于PID控制的四旋翼无人机系统Matlab仿真

摘要 本文基于PID控制设计了一种四旋翼无人机控制系统&#xff0c;并通过Matlab进行仿真验证。研究了姿态控制和位置控制的性能&#xff0c;仿真结果表明该系统在稳定性和响应速度方面具有良好的表现。本文的主要贡献是验证了PID控制器在多轴飞行器控制中的有效性&#xff0c;…

基于mongodb+flask(Python)+vue的实验室器材管理系统

实验室器材管理系统是一个现代化的、高度集成的软件解决方案&#xff0c;它结合了Flask作为后端框架&#xff0c;MongoDB作为数据库&#xff0c;以及Vue.js作为前端用户界面&#xff0c;专为优化和精简实验室设备及耗材的管理流程而设计。此系统旨在为实验室管理员、研究人员和…

3.C++入门(内联函数,c++11,auto,范围for,nullptr)

⭐本篇文章为C学习的第三篇&#xff1a;主要了解内联函数和部分c11新特性 ⭐本人c代码的Gitee仓库&#xff1a;c学习 橘子真甜/yzc的c学习 - 码云 - 开源中国 (gitee.com) 一. 内联函数 以inline修饰的函数称为内联函数&#xff0c;编译的时候c编译器会在内联函数的地方展开&a…

AI 平台 formulabot 介绍

AI 平台 formulabot 介绍 FormulaBot.com 是一个基于人工智能的数据分析平台&#xff0c;旨在简化数据处理和分析任务 主要功能 数据分析与可视化: Formula Bot 提供工具来分析、可视化和转换数据&#xff0c;使用户能够快速理解数据背后的信息。公式生成: 用户可以通过自然…

别再过度复杂化了,实体SEO其实就是SEO

“实体SEO”。听起来有点可怕&#xff0c;是不是&#xff1f;不仅“实体”这个词听起来有点陌生&#xff0c;还感觉又是要在你永无止境的SEO待办清单上再添加一项。你在SEO方面已经捉襟见肘了&#xff0c;但天啊&#xff0c;又有一个新事物需要你投入稀缺的资源。 不过我有好消…

springboot-创建连接池

操作数据库 代码开发步骤&#xff1a; pom.xml文件配置依赖properties文件配置连接数据库信息&#xff08;连接池用的是HikariDataSource&#xff09;数据库连接池开发 configurationproperties和value注解从properties文件中取值bean方法开发 service层代码操作数据库 步骤&am…

component 和slot -----vue3

前言: 辗转几个公司发现基本上有点规模的公司都会有自己的平台,无论是开发平台还是其他什么,都脱离不了一个功能点,那就是组件;无论你是自己从0到1建立的平台还是基于别的已有的平台,都是这样;无非是组件的套娃,只要你梳理清楚平台的主要枝干,熟悉一些前端基本知识,然后掌握组件…

2024年CAD图纸加密软件大盘点:10款高效CAD加密工具大揭秘!

在当今数字化时代&#xff0c;CAD图纸的安全性变得尤为重要。随着设计数据的不断增长&#xff0c;保护这些敏感信息免受未经授权的访问和泄露已成为企业必须面对的挑战。为了应对这一需求&#xff0c;市场上涌现了众多CAD图纸加密软件。本文将为您盘点2024年最值得关注的10款高…

OpenAI 的 o1 大模型在数学和编码方面有了几乎 10 倍的能力提升!

你有没有想过,有一天人工智能可以在数学和编程这两个领域里,真正成为人类的“得力助手”,甚至是超越我们?最近,OpenAI 发布的 o1大模型在这方面取得了几乎 10 倍的能力提升。10 倍!你没有看错。这样的进步让人不禁怀疑:AI 真的能做到“秒懂”数学和编程吗?今天,我们就…

骨传导耳机品牌排行榜前五名,有哪些好用的骨传导耳机品牌值得入手?

我是一名专业的数码产品测评博主&#xff0c;在多年的职业生涯中&#xff0c;发现很多人在使用骨传导耳机后都出现了佩戴不舒服的现象。对此&#xff0c;我希望大家能重视骨传导耳机款式的挑选&#xff0c;因为市面上不专业的产品数量众多&#xff0c;它们纷纷打着保护听力的旗…

【Python爬虫系列】_019.生产者和消费者模型

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈PyQt5 系 列 教 程:👉👉 Python

服务器数据恢复—Linux操作系统环境下网站数据的恢复案例

服务器数据恢复环境&#xff1a; 一台linux操作系统服务器上跑了几十个网站&#xff0c;服务器上只有一块SATA硬盘。 服务器故障&#xff1a; 服务器突然宕机&#xff0c;尝试再次启动失败。将硬盘拆下检测&#xff0c;发现存在坏扇区。找当地一家数据恢复公司处理后&#xff…

Application pool xxx has been disabled

现象&#xff1a; 项目采用分布式应用&#xff0c;总共三台服务器&#xff0c;第一台的某个应用无法访问报错Error: Service Layer is under maintenance&#xff0c;第二三台可以正常访问 问题排查&#xff1a; 通过排查ETW&#xff08;无任何报错&#xff09;和EventLog发现…