MELON的难题- 华为OD统一考试(E卷)

2024华为OD机试(C卷+D卷)最新题库【超值优惠】Java/Python/C++合集

华为od机试

题目描述

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

输入:

4
1 1 2 2

输出:

2

说明:
输入表示 4 块雨花石,第二行代表4颗雨花石的重量分别为 1,1,2,2。均分时只能分别为1,2,需要拿出重量为1和2的两块雨花石,所以输出2。

示例2

输入:

10
1 1 1 1 1 1 9 8 7 10

输出:

3

说明:
输入第一行代表共10颗雨花石,第二行代表4颗雨花石重量分别为1、1、1、1、1、9、8、3、7、10 。

均分时可以1,1,1,1,1,9,7和10,8,3,也可以1,1,1,1,9,8和10,7,3,1,或者其他均分方式,但第一种只需要拿出重量为10,8,3的3块雨花石,第二种需要拿出4块,所以输出3(块数最少)。

题解

这道题目是经典的动态规划类型问题。具体来说,它是0/1 背包问题的变形,核心在于判断是否可以将雨花石分成两部分,使得每部分的重量相等,并找到最小的分割块数。

解题思路

  1. 问题分析:题目要求将一堆雨花石分为两堆,重量相等。我们可以把问题转换为,能否找到一个子集,使其总重量为所有雨花石总重量的一半。若总重量为奇数,则无法平分,直接返回 -1
  2. 动态规划思路
    • 定义一个 dp 数组,dp[i] 表示选择若干个雨花石其总重量恰好为 i时最小的选择块数。
    • 初始化时,dp[0] = 0 表示总重量为 0 时需要的雨花石块数为 0,其余 dp[i] 初始化为无穷大。
    • 对每个雨花石,我们更新 dp 数组,尝试是否可以通过当前雨花石的加入,组成目标重量的一部分。
    • 最终通过动态规划判断,是否可以拼出目标重量,并记录最少的块数。
  3. 特殊情况
    • 如果雨花石的总重量为奇数,则无法平分,直接输出 -1

Java

import java.util.Scanner;
import java.util.Arrays;
/*** @author code5bug*/
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();  // 读取雨花石数量int[] stones = new int[n];  // 保存雨花石的重量// 输入雨花石的重量并计算总重量int total = 0;for (int i = 0; i < n; i++) total += stones[i] = sc.nextInt();// 总重量为奇数时无法平分if (total % 2 == 1) {System.out.println(-1);return;}// 目标是找到总重量为一半的子集int half = total / 2;// dp[x] 表示分配总重量 x 时拿出最少的块数int[] dp = new int[half + 1];Arrays.fill(dp, Integer.MAX_VALUE);  // 初始化 dp 数组为最大值dp[0] = 0;  // 重量为 0 时需要的雨花石数为 0// 动态规划更新 dp 数组for (int stone : stones) {for (int j = half; j >= stone; j--) {if (dp[j - stone] != Integer.MAX_VALUE) {dp[j] = Math.min(dp[j], dp[j - stone] + 1);}}}// 输出结果,判断是否可以找到重量为 half 的子集System.out.println(dp[half] == Integer.MAX_VALUE ? -1 : dp[half]);}
}

Python

def solve(stones):total = sum(stones)# 如果总重量是奇数,无法平分if total % 2:return -1# 目标是找到总重量为一半的子集half = total // 2# dp[x] 表示分配总重量 x 时拿出最少的块数dp = [float('inf')] * (half + 1)dp[0] = 0# 动态规划,更新 dp 数组for stone in stones:for j in range(half, stone - 1, -1):if dp[j - stone] != float('inf'):dp[j] = min(dp[j], dp[j - stone] + 1)# 输出结果return -1 if dp[half] == float('inf') else dp[half]if __name__ == '__main__':n = int(input())  # 读取雨花石数量stones = list(map(int, input().split()))  # 输入雨花石的重量# 输出结果print(solve(stones))

C++

#include <bits/stdc++.h>
using namespace std;int main()
{int n;cin >> n;vector<int> stones(n);int         tot = 0;for (int i = 0; i < n; i++) {cin >> stones[i];tot += stones[i];}// 总重量为奇数不可能平分if (tot % 2) {cout << -1 << endl;return 0;}// 目标是找到总重量为一半的子集int half = tot / 2;//  dp[x] 表示分配总重量 x 时拿出最少的块数vector<int> dp(half + 1, INT_MAX);dp[0] = 0;for (int stone : stones) {for (int j = half; j >= stone; j--) {if (dp[j - stone] != INT_MAX) {dp[j] = min(dp[j], dp[j - stone] + 1);}}}cout << (dp[half] == INT_MAX ? -1 : dp[half]) << endl;return 0;
}

相关练习题

题号题目难易
LeetCode 322322. 零钱兑换中等
LeetCode 416416. 分割等和子集中等
LeetCode 494494. 目标和中等

整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

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

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

相关文章

爬虫 ----hook

目录 定义&#xff1a; 了解什么是hook? 举例 hook XHR请求 XMLHttpRequest 案例地址&#xff1a; Interceptors-拦截器 HOOK cookie操作 cookie 示范 常见的hook代码总结 1.Hook Cookie 2.Hook Header 3.Hook URL 4.Hook JSON.stringify 5.Hook JSON.parse 6.Ho…

Mac使用gradle编译springboot-2.7.x源码

1 开发环境&#xff1a; JDK8 ideaIU-2024.2.2 gradle-7.6.3 代理网络 2 下载springboot源码 代码仓库网址 git clone -b 2.7.x https://github.com/spring-projects/spring-boot.git3 安装gradle gradle下载网址 https://services.gradle.org/distributions/ 安装此文件指…

C语言 | Leetcode C语言题解之第415题字符串相加

题目&#xff1a; 题解&#xff1a; char* addStrings(char* num1, char* num2) {int i strlen(num1) - 1, j strlen(num2) - 1, add 0;char* ans (char*)malloc(sizeof(char) * (fmax(i, j) 3));int len 0;while (i > 0 || j > 0 || add ! 0) {int x i > 0 ?…

lsof可以查看当前系统中正在被使用的文件,包括动态库

lsof的英文是 list open files lsof直接回车&#xff0c;会显示很多&#xff0c;可以配合more命令查看 lsof | more -10 sudo lsof | more -20 lsof查看正在使用某个动态库的进程 lsof /lib/x86_64-linux-gnu/libc.so.6 lsof /usr/lib/x86_64-linux-gnu/libc.so.6 l…

如何优化苹果CMS 泛目录的缓存管理?

在使用苹果CMS进行内容管理时&#xff0c;缓存管理是提升网站性能的重要环节。随着技术的不断发展&#xff0c;泛目录插件的缓存机制也逐渐变得不再必要。&#xff08;maccmscn&#xff09;本文将探讨如何在不使用缓存的情况下&#xff0c;优化苹果CMS泛目录的性能&#xff0c;…

(学习记录)使用 STM32CubeMX——配置时钟(入门)

使用STM32CubeMX配置STM32F103C8T6时钟部分 选择芯片 ①&#xff1a;选择MCU型号 ①&#xff1a;这里使用英文输入法&#xff0c;输入你想要的芯片型号&#xff0c;我这里采用STM32F103C8T6 ②&#xff1a;这里能看到搜索后出来的芯片具体型号&#xff0c;选择匹配度最高的一个…

MySQL-排名函数ROW_NUMBER(),RANK(),DENSE_RANK()函数的异同

MySQL-排名函数ROW_NUMBER()&#xff0c;RANK()&#xff0c;DENSE_RANK()函数的异同 前言 假设有如下表结构与数据&#xff0c;class_id表示班级&#xff0c;需求&#xff1a;现在要按照班级分组&#xff0c;每个班级的学生进行年龄从小到大排序 一、ROW_NUMBER()函数 ROW_NUM…

Linux中的调度算法

nice值的范围有限&#xff0c;即为[-20, 19]&#xff0c;也就是40个数字&#xff0c;优先级为[60, 99]即一共40个优先级 目前谈论的Linux操作系统叫做分时操作系统&#xff0c;调度的时候主要强调公平&#xff0c;还有一种是实时操作系统&#xff0c;比如智能汽车里面必须装有这…

【面经】查找中常见的树数据结构

查找中常见的树数据结构 一、二叉排序&#xff08;搜索、查找&#xff09;树&#xff08;BST&#xff0c;Binary Search Tree&#xff09;&#xff08;1&#xff09;二叉排序树的查找、插入和删除过程&#xff08;2&#xff09;叉树排序树的缺陷&#xff08;3&#xff09;二叉排…

Spark原理及调优

spark官档 hints&#xff1a;https://spark.apache.org/docs/3.0.0/sql-ref-syntax-qry-select-hints.html调优参数&#xff1a;https://spark.apache.org/docs/latest/sql-performance-tuning.html#join-strategy-hints-for-sql-queries作者几乎把所有的RDD API查了个遍&…

【服务器入门】Linux系统基础知识

【服务器入门】Linux系统基础知识 远程登录与文件传输基础命令与文本编辑vi/vim使用shell脚本基本命令1、目录操作2、文件创建与删改3、文件连接与查看 参考 目前超算使用的系统以Linux系统为主&#xff0c;肯定需要了解一些相关知识。本博客就以本人运行WRF模型所需&#xff0…

7-50 畅通工程之局部最小花费问题 (kruskal)

输入样例: 4 1 2 1 1 1 3 4 0 1 4 1 1 2 3 3 0 2 4 2 1 3 4 5 0输出样例: 3 代码&#xff1a; #include<iostream> #include<queue> using namespace std; const int N110; struct node{int x,y,w;bool operator <(const node &n1)const{if(wn1.w) retur…

提升编程效率的秘诀:多数人竟然忽略了它!

在编程学习的过程中&#xff0c;许多人会专注于算法、数据结构、编程语言的学习&#xff0c;而往往忽略了一个至关重要的基础技能——键盘盲打。虽然看似与编程能力无关&#xff0c;但盲打不仅可以显著提高编程效率&#xff0c;还能帮助编程者更好地集中注意力。本文将深入探讨…

数字图像面积计算一般方法及MATLAB实现

一、引言 在数字图像处理中&#xff0c;经常需要获取感兴趣区域的面积属性&#xff0c;下面给出图像处理的一般步骤。 1.读入的彩色图像 2.将彩色图像转化为灰度图像 3.灰度图像转化为二值图像 4.区域标记 5.对每个区域的面积进行计算和显示 二、程序代码 %面积计算 cle…

加密视频播放器 EncodedPlayer V3.1使用说明

使用说明 加密视频播放器 EncodedPlayer可对视频发布者提供的特定加密视频进行播放&#xff0c;以达到保护视频内容不被未经授权的用户访问或盗版的目的。 点击【打开】可选择格式为.Apol的加密视频文件并进行播放。为防止视频翻录&#xff0c;播放器会在视频中添加当前用户…

银河麒麟操作系统重装后重新激活是否会额外消耗一个激活码?

银河麒麟操作系统重装后重新激活是否会额外消耗一个激活码&#xff1f; 1、激活码会额外消耗吗&#xff1f;2、重装后如何重新激活&#xff1f;3、注意事项4 总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在使用银河麒麟操作系统时&a…

解释器模式:将语法规则与执行逻辑解耦

解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为设计模式&#xff0c;它提供了评估语言的语法或表达式的方式。该模式通过定义一个语言的文法表示&#xff0c;并通过解释这些表示来执行相应的操作。 解释器模式主要用于设计一种特定类型的计算机语言或表达式…

JVM面试问题集

什么是JVM? 了解过字节码文件的组成吗? 说一下运行时数据区 哪些区域会出现内存溢出&#xff0c;会有什么现象? JM在JDK6-8之间在内存区域上有什么不同 类的生命周期 什么是类加载器 什么是双亲委派机制 打破双亲委派机制 Tomcat的自定义类加载器

51单片机——数码管

一、数码管原理图 我们发现&#xff0c;总共有8个数码管。 它们的上面接8个LED&#xff0c;用来控制选择哪个数码管。例如要控制第三个数码管&#xff0c;就让LED6为0&#xff0c;其他为1&#xff0c;那LED又接到哪呢&#xff1f; 二、LED 由图可以看出&#xff0c;这个一个1…

Linux之实战命令04:rename应用实例(三十八)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…