华为OD机试真题 Java 实现【MELON的难题】【2023 B卷 100分】,采用动态规划算法,附详细解题思路

news2024/12/23 14:22:54

在这里插入图片描述

目录

    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、动态规划
    • 五、解题思路
    • 六、Java算法源码
    • 七、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

大家好,我是哪吒。

做技术,我是认真的,立志于打造最权威的华为OD机试真题专栏,帮助那些与我有同样需求的人(考华为OD机试,升职加薪),每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑

华为OD机试(JAVA)真题(A卷+B卷)

一、题目描述

MELON有一堆精美的雨花石(数量为n,重量各异),准备送给S和W。MELON希望送给俩人的雨花石重量一致,请你设计一个程序,帮MELON确认是否能将雨花石平均分配。

二、输入描述

第1行输入为雨花石个数: n,0<n<31。
第2行输入为空格分割的各雨化石重量: m[0] m[1] … m[n- 1], 0< m[k] < 1001
不需要考虑异常输入的情况。

三、输出描述

如果可以均分,从当前雨花石中最少拿出几块,可以使两堆的重量相等;如果不能均分,则输出-1。

四、动态规划

看到题目,我的第一反应是采用动态规划求解,目标值是雨花石重量总和的一半,从当前雨花石中最少拿出几块,满足两人的雨花石均分。

先区分一下动态规划与分治方法,都是将原问题拆分成若干个子问题,分别求解,再组合子问题的结果选出最优解。

分治方法将问题划分为互不相交的子问题,递归的求解子问题,再将它们的解组合起来,求出原问题的解。

动态规划应用与子问题重叠的情况,即不同的子问题具有公共的子子问题(子问题的求解是递归进行的,将其划分为更小的子子问题),在这种情况下,分治方法会做许多不必要的工作,他会反复求解那些公共子子问题。

而动态规划对于每一个子子问题只求解一次,将其解保存在一个表格里面,从而无需每次求解一个子子问题时都重新计算,避免了不必要的计算工作。

五、解题思路

  1. 输入有几块雨花石;
  2. 输入每块雨花石的重量;
  3. 通过Java8新特性 Stream表达式获取每块雨花石的重量;
  4. 获取雨花石的总重量;
  5. 因为要两个人平分,不能平分的话,直接返回-1;
  6. 计算雨花石的一半重量,也就是两个人得到的重量,计算动态规划目标值;
  7. 定义二维数组dp,采用动态规划算法,求出最优解;

六、Java算法源码

package com.guor.od;

import java.util.Scanner;
import java.util.*;

public class OdTest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 输入有几块雨花石
        int n = Integer.parseInt(sc.nextLine());
        // 输入每块雨花石的重量
        int[] nums = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        // 获取雨花石的总重量
        int sum = Arrays.stream(nums).sum();

        // 因为要两个人平分,不能平分的话,直接返回-1
        if (sum % 2 != 0) {
            System.out.println(-1);
            return;
        }

        // 雨花石的一半重量,也就是两个人得到的重量,计算目标
        int avg = sum / 2;
        // 采用动态规划算法
        int[][] dp = new int[n + 1][avg + 1];

        for (int i = 0; i <= avg; i++) {
            dp[0][i] = n;
        }

        for (int i = 1; i <= n; i++) {
            int num = nums[i - 1];
            for (int j = 1; j <= avg; j++) {
                if (j < num) {
                    dp[i][j] = dp[i - 1][j];
                } else {
                    dp[i][j] = Math.min(dp[i - 1][j], dp[i - 1][j - num] + 1);
                }
            }
        }

        if (dp[n][avg] == n) {
            System.out.println(-1);
        } else {
            // 输出最优解
            System.out.println(dp[n][avg]);
        }
    }
}

七、效果展示

1、输入

4
1 2 3 4

2、输出

2

3、说明

在这里插入图片描述


🏆下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路

🏆本文收录于,华为OD机试(JAVA)(2022&2023)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

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

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

相关文章

【LeetCode热题100】打卡第35天:最小栈相交链表

文章目录 【LeetCode热题100】打卡第35天&#xff1a;最小栈&相交链表⛅前言 最小栈&#x1f512;题目&#x1f511;题解 相交链表&#x1f512;题目&#x1f511;题解 【LeetCode热题100】打卡第35天&#xff1a;最小栈&相交链表 ⛅前言 大家好&#xff0c;我是知识汲…

MySQL-分库分表详解(一)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

C进阶:指针的进阶(1)

回归 哈喽哈喽大家好呀&#xff0c;我是灰灰快醒醒&#xff0c;时隔一个月又与大家见面了。众所周知&#xff0c;期末考试是中国教育部为大学生专门研发的一款开放式大逃杀游戏&#xff0c;学生需要扮演大难将至而绝望的人类&#xff0c;与小骚书共同完成《期末复习》的任务&a…

【无标题】采用技术外包做项目开发,不得不说的四大注意事项

在进行多项目开发及多个研发供应商团队管理&#xff08;技术外包管理&#xff09;时&#xff0c;你是不是也遇到不少问题。 项目管理者A&#xff1a;在项目开发中聘用外包技术团队的过程中&#xff0c;我踩过太多的坑&#xff0c;换过一批又一批的供应商&#xff0c;之前遇到过…

I.MX8MM系统构建 -- 1.系统烧录

硬件环境&#xff1a;米尔 MY8-C8MMX V1.3开发板软件工具&#xff1a;uuu烧录工具 环境准备 硬件环境 将开发板拨码开关调整为SW1(ON,OFF,x,x) SW2(x,x,x,x)&#xff0c;按照丝印字体方向向上为OFF&#xff0c;向下为ON。将开发板USB连接到PC给开发板通上12V电源(注意先修改拨…

Django框架之CSRF使用篇

Django框架之CSRF使用篇 目录 全局使用 设置csrf token 表单使用 脚本使用 单独豁免 引入csrf类库 设置单独豁免csrf 单独保护 关闭全局csrf 引入csrf库 设置函数保护 csrf token配置 总结 全局使用 Django项目配置中默认全局使用csrf中间件&#xff0c;注释掉即…

最新Jupyter Notebook(保姆级教程)

Jupyter Notebook介绍 什么是Jupyter Notebook Jupyter Notebook 是一个基于 Web 的交互式计算环境&#xff0c;支持多种编程语言&#xff0c;包括 Python、R、Julia 等。它的主要功能是将代码、文本、数学方程式、可视化和其他相关元素组合在一起&#xff0c;创建一个动态文…

STM32 Proteus仿真语音播报SGP30火灾报警器温度湿度-0072

STM32 Proteus仿真语音播报SGP30火灾报警器温度湿度-0072 Proteus仿真小实验&#xff1a; STM32 Proteus仿真语音播报SGP30火灾报警器温度湿度-0072 功能&#xff1a; 硬件组成&#xff1a;STM32F103C6单片机 0.960LED显示屏DHT11温度湿度电位器模拟SGP30二氧化碳传感器蜂鸣…

Layui实现动态树效果(书籍管理系统左侧下拉列表)

目录 一、前言 1.什么是树形菜单 2.树形菜单的使用场景 二、案例实现 1.需求分析 2.前期准备工作 ①导入依赖 ②工具类 BaseDao&#xff08;通用增删改查&#xff09; BuildTree(完成平级数据到父子级的转换) ResponseUtil&#xff08;将数据转换成json格式进行回显&…

1、Kubernetes 概述和架构

目录 一、基本介绍 二、kubernetes功能和架构 2.1、 概述 2.2 、功能 &#xff08;1&#xff09;自动装箱 &#xff08;2&#xff09;自我修复(自愈能力) &#xff08;3&#xff09;水平扩展 &#xff08;4&#xff09;服务发现 &#xff08;5&#xff09;滚动更新 &a…

磷铁环压脱机液压站比例阀放大器

冷轧热镀锌线液压系统比例阀放大器 热轧带钢步进梁式加热炉液压系统比例阀放大器 热轧带钢液压系统比例阀放大器 板坏连铸液压系统比例阀放大器 钢包精炼炉液压系统比例阀放大器 磷铁环压脱机液压站比例阀放大器 热轧带钢液压系统是一种用于热轧带钢生产的液压系统。它的…

校招失败后,在小公司熬了 2 年终于进了华为,竭尽全力....

其实两年前校招的时候就往华为投了一次简历&#xff0c;结果很明显凉了&#xff0c;随后这个理想就被暂时放下了&#xff0c;但是这个种子一直埋在心里这两年除了工作以外&#xff0c;也会坚持写博客&#xff0c;也因此结识了很多优秀的小伙伴&#xff0c;从他们身上学到了特别…

LiveGBS流媒体平台GB/T28181功能-支持UDP、TCP被动、TCP主动模式流传输模式之间有什么区别?

LiveGBS流媒体平台-国标流媒体服务几种流传输模式UDP、TCP被动、TCP主动模式区别是什么 1、背景1、GB28181流传输模式1.1、UDP1.2、TCP 被动1.3、TCP 主动 2、切换流传输模式2.1、编辑2.2、下拉切换 3、搭建GB28181视频直播平台 1、背景 国标GB28181协议中&#xff0c;视频流到…

什么是人工智能中的数据标注?

人工智能数据标注是对文本、视频、图像等元数据进行标注的过程&#xff0c;标记好的数据将用于训练机器学习的模型。常见的数据标注类型有文本标注、语义分割和图像视频标注。这些经标注的训练数据集可用于训练自动驾驶、聊天机器人、翻译系统、智能客服和搜索引擎等人工智能应…

LeetCode[239]滑动窗口最大值

难度&#xff1a;Hard 题目&#xff1a; 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xf…

强化学习课程笔记一

强化学习基础概念及MDP算法&#xff0c;如图1所示 这张ppt上就展现了一节课全部的内容&#xff1a; Sets中有表示状态的S、有表示动作的A(s)、有表示奖励的R(s,a)&#xff0c;如图二所示 也介绍了概率分布&#xff08;Probability distribution&#xff09; 其中State transi…

2D组态:智慧生物质发电厂组态监控系统

进入21世纪以来&#xff0c;我国面临的能源安全和环境生态保护问题日趋严峻&#xff0c;可再生能源已经成为能源发展战略的重要组成部分以及能源转型的重要发展方向。根据可再生能源应用的不同领域&#xff0c;电力系统建设正在发生结构性转变&#xff0c;可再生能源发电已开始…

【技能实训】DMS数据挖掘项目-Day06

文章目录 任务6【任务6.5】编写物流数据分析类【任务6.6】创建物流数据分析测试类&#xff0c;测试任务6.5-6.6中的程序&#xff0c;演示物流信息的采集、分析及打印输出 任务6 【任务6.1】创建数据分析接口 在com.qst.dms.gather 下创建接口IDataAnalyse.java 【任务6.2】创…

【多线程进阶】多线程进阶学习(高并发、线程池、多线程使用场景)

文章目录 1、线程基础知识1.1、线程和进程线程和进程的区别&#xff1f; 1.2、并行与并发并行与并发有什么区别&#xff1f; 1.3、线程的创建方式创建线程的方式有哪些&#xff1f;刚才你说过&#xff0c;使用runnable和callable都可以创建线程&#xff0c;它们有什么区别呢&am…

MySQL数值

1.整数类型 TINYINT&#xff1a;非常小的整数&#xff0c;存储空间为1字节&#xff0c; 取值范围&#xff1a;有符号&#xff1a;-128---127&#xff0c;无符号&#xff1a;0---255 SMALLINT&#xff1a;小整数&#xff0c;存储空间为2字节 取值范围&#xff1a;有符号&#…