【华为OD题库-057】MELON的难题-java
题目
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 9 8 3 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(块数最少)。
思路
两个方案:
排列组合
排列组合思路参照模板:【JAVA-排列组合】一个套路速解排列组合题
针对本题而言,简要分析如下:
首先计算雨花石的重量总和sum,sum不能被2整除,直接返回-1。能被2整除,那么我们至少需要拿出多少块雨花石,使其重量和target=sum/2。
要求最少数量,先拿重量较大的雨花石,所以可以将输入nums降序排列,剪枝分析如下:
- 雨花石重量可能存在重复,注意同层相同剪枝
- 如果某个组合的雨花石重量在加入下一个雨花石之前,已经不小于target或者组合个数已经不小于之前解的个数,直接剪枝
最后注意,因为要求的res为最小值,初始值设置的Integer.MAX_VALUE ,如果没有找到合适的组合,res还是等于Integer.MAX_VALUE,那么最后需要返回-1.
动态规划
定义:
dp[i][j]的含义为:在前i个雨花石选择,使其重量和等于j,需要的最少雨花石个数。
初始化:
dp[i][0],要使目标和等于0,那么选0个即可,所以dp[i][0]=0,其中i的范围为:0~nums.length-1
dp[0][j],从前0个元素选(即只有nums[0]可选,目标和就是nums[0]),使其累加和为j(j的范围为0~target),如果j=nums[0],那么dp[0][j]=1,否则给其一个初始值。具体初始值给多少? 比如nums为:2 3 4 5,dp[0][2]=1。dp[0][3]不可能满足(只选2,不可能使其和等于3),可以将其结果设置为一个比较大的值(因为最后取的最小值,如果存在一个满足条件的值,两相比较就能得到最小结果)。这里我设置为nums.length。递推关系:
对于dp[i][j](i>0,j>0),只有两种情况,当前值选和当前值不选当前值选:dp[i][j]=dp[i-1][j-nums[i]]+1
当前值不选: dp[i][j]=dp[i-1][j]
结果中两者取其小即可。同时需要注意,如果当前值比目标j还大,那肯定走不选的分支
根据初始化和递推关系,最后求得dp[nums.length-1][target],如果其值等于nums.length(即初始化的值),说明不存在这样的组合,直接返回-1。
题解
排列组合
package hwod;import java.util.Arrays;
import java.util.LinkedList;
import java.util.Scanner;public class YuhuaStone {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = Integer.parseInt(sc.nextLine());int[] nums = new int[n];for (int i = 0; i < n; i++) {nums[i] = sc.nextInt();}System.out.println(yuHuaStone(nums));}private static int res = Integer.MAX_VALUE;private static int yuHuaStone(int[] nums) {int sum = Arrays.stream(nums).sum();if (sum % 2 != 0) return -1;int target = sum / 2;int[] used = new int[nums.length];LinkedList<Integer> path = new LinkedList<>();Arrays.sort(nums);dfs(nums, nums.length - 1, path, used, target);return res == Integer.MAX_VALUE ? -1 : res;}private static void dfs(int[] nums, int start, LinkedList<Integer> path, int[] used, int target) {if (target == 0) {res = Math.min(res, path.size());return;}for (int i = start; i >= 0; i--) {if (target <= 0 || path.size() >= res) break;if (i < nums.length - 1 && nums[i + 1] == nums[i] && used[i + 1] == 0) continue;path.addLast(nums[i]);used[i] = 1;dfs(nums, i - 1, path, used, target - nums[i]);path.removeLast();used[i] = 0;}}
}
动态规划
package hwod;import java.util.Arrays;
import java.util.LinkedList;
import java.util.Scanner;public class YuhuaStone {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = Integer.parseInt(sc.nextLine());int[] nums = new int[n];for (int i = 0; i < n; i++) {nums[i] = sc.nextInt();}System.out.println(yuHuaStone(nums));}private static int yuHuaStone(int[] nums) {int sum = Arrays.stream(nums).sum();if (sum % 2 != 0) return -1;int target = sum / 2;int size = nums.length;int[][] dp = new int[size][target + 1];for (int j = 0; j < target + 1; j++) {if (j == nums[0]) dp[0][j] = 1;else dp[0][j] = size;}for (int i = 1; i < size; i++) {for (int j = 1; j <= target; j++) {if (nums[i] > j) dp[i][j] = dp[i - 1][j];else dp[i][j] = Math.min(dp[i - 1][j], 1 + dp[i - 1][j - nums[i]]);}}int res = dp[size - 1][target];return res == size ? -1 : res;}
}
用例
补充输出-1的用例
用例一
6
2 5 5 6 7 10
用例二
3
2 3 3
推荐
如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。
相关文章:
【华为OD题库-057】MELON的难题-java
题目 MELON有一堆精美的雨花石(数量为n,重量各异),准备送给S和W。MELON希望送给俩人的雨花石重星一致,请你设计一个程序帮MELON确认是否能将雨花石平均分配。 输入描述 第1行输入为雨花石个数:n,0<n <31. 第2行输入为空格分…...
OGG实现Oracle19C到postgreSQL14的实时同步
📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…...
windows 你的电脑不能投影到其他屏幕,请尝试重新安装驱动程序
注意 千万不要去下载什么驱动精灵,太垃圾不好用还一堆附带的软件。按以下步骤进行解决: 解决方法 可能是显卡驱动的问题,我的笔记本按照如下步骤重启一下驱动后解决了,步骤如下: 右键点击桌面的开始菜单,选择”设备…...
2023-简单点-树莓派中的硬件通讯
树莓派中的通讯方式 串口通讯什么是串口通讯?串口通讯的特点 tips并行通讯?基于网络的通讯?socket通讯 串口通讯 什么是串口通讯? 串行通信每次传输一个位元数据,并在连续进行单次过程的基础上进行通信。根据数据的传送方向&am…...
游戏反Frida注入检测方案
在游戏安全对抗过程中,有不少外挂的实现基于对游戏内存模块进行修改,这类外挂通常会使用内存修改器,除此之外,还有一种门槛相对更高、也更难检测的「注入挂」。 据FairGuard游戏安全数据统计,在游戏面临的众多安全风险…...
观海微电子---AF、AG、AR 的差别和作用
一、名称解释及原理 1.AF ---- Anti-fingerprint,中文为抗指纹。一般 SiO2AF 材料(DON,M4、道康宁 AF 材料),一般采用真空蒸发镀膜法。 原理:AF 防污防指纹玻璃是根据荷叶原理,在玻璃外表面涂制…...
颠覆性语音识别:单词级时间戳和说话人分离
vbenjs/vue-vben-admin[1] Stars: 19.7k License: MIT Vue Vben Admin 是一个免费开源的中后台模板,使用最新的 vue3、vite4 和 TypeScript 等主流技术进行开发。该项目提供了现成的中后台前端解决方案,并可用于学习参考。 使用先进的前端技术如 Vue3/…...
吉利展厅 | 透明OLED拼接2x2:科技与艺术的完美融合
产品:4块55寸OLED透明拼接屏 项目地点:南宁 项目时间:2023年11月 应用场景:吉利展厅 在2023年11月的南宁,吉利展厅以其独特的展示设计吸引了众多参观者的目光。其中最引人注目的亮点是展厅中央一个由四块55寸OLED透…...
qnx修改tcp和udp缓冲区默认大小
拷贝/home/test/qnx/qos223/target/qnx7/aarch64le/sbin/sysctl进系统中 https://www.qnx.com/developers/docs/7.1/#com.qnx.doc.neutrino.utilities/topic/s/sysctl.html kern.sbmax 默认262144,这个限制住了发送、接收缓冲器大小 ./sysctl -w kern.sbmax10000…...
vscode的eslint检查代码格式不严谨的快速修复
问题: 原因:复制的代码,esLint检查代码格式不正确。或者写的代码位置不严谨,总是提示 解决 设置在Ctrl S保存时自动格式化代码 1、vscode设置 2、点击右上角,切换json模式 3、添加设置 "editor.codeActionsOn…...
OpenAI GPT-4 Turbo发布:开创AI新时代
🎥 屿小夏 : 个人主页 🔥个人专栏 : IT杂谈 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一. GPT-4 Turbo的突破1.1上下文长度和控制手段的加强:1.2多模态支持:…...
基于c 实现 FIFO
功能: 1、读和写长度不限制 2、数据操作 和 指针操作分开(如先操作数据,再操作指针) 适用场景: 单向通信模式,一方写、一方读,可用于任务间单向通信(无需锁) 如&…...
tortoisegit 报错:server refused to start a shell/command
原因:阿里云的云效不支持TortoiseGit 使用 TortoiseGitPlink,请修改为 OpenSSH。 官网修改教程:TortoiseGit 工具相关报错如何处理? 基本流程: 选择设置(Settings),选择通用&#x…...
电商平台API接口指南,京东商品详情接口,京东详情页接口,宝贝详情页接口,商品属性接口,商品信息查询,商品详细信息接口,h5实时详情页数据展示
京东商品详情API接口是京东开放平台提供的一种API接口,通过该接口,可以获取到京东商品的详细信息,如商品名称、价格、图片和描述等信息。 使用方法如下: 注册并获取API密钥:首先需要在京东开放平台上注册并获取API密…...
什么是迁移学习
1 迁移学习概述 迁移学习(Transfer Learning)是机器学习中的一种方法,它允许模型将从一个任务中学到的知识应用到另一个相关的任务中。这种方法在数据稀缺的情况下尤为有用,因为它减少了对大量标记数据的需求。迁移学习已成为深度…...
万宾科技水环境综合治理监测系统的融合与应用
随着社会经济的快速发展,我国的水环境污染问题日益凸显,这不仅对生态环境造成了严重破坏,也严重威胁到人民群众的健康和生活质量。为了解决这一问题,城市生命线与水环境综合治理监测系统应运而生,二者的结合将为水环境…...
【EI会议征稿】第三届图像,信号处理与模式识别国际学术会议(ISPP 2024)
第三届图像,信号处理与模式识别国际学术会议(ISPP 2024) 2024 3rd International Conference on Image, Signal Processing and Pattern Recognition(ISPP 2024) 第三届图像,信号处理与模式识别国际学术会议…...
继阿里云、滴滴、语雀后,腾讯视频也出现重大系统故障
昨晚,许多网友报告称腾讯视频出现了网络故障,具体表现为首页无法加载内容、VIP 用户无法观看会员视频等问题。 针对这一问题,腾讯视频回应称:目前腾讯视频遇到了暂时的技术问题,正在紧急修复中,各项功能正在…...
kotlin中sealed语句的使用
sealed 密封类是 Kotlin 中的一种特殊类别,它的主要作用是限制类的继承结构。密封类用于表示受限的类继承结构,即一个值只能有有限几种类型,而不能有任意类型。密封类通常用于表示一种有限集合的类型。 下面是密封类的主要特性和作用&#x…...
软信天成:数据泄露日趋严重 “资产”保护何去何从
随着数据应用的逐渐深入,越来越多的企业意识到:数据作为信息的载体,可以成为企业知识产权、收益流和具备竞争优势的基础资产。然而,当包含大量敏感信息的数据被视作资产时,亦将直面信息被“窃取”、“泄露”和“滥用”…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
