华为OD机试之MELON的难题(Java源码)

news2024/11/25 9:47:18

MELON的难题

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


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


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

用例

输入输出说明
4
1 1 2 2
2总和为 1+1+2+2=6 那么 可以拿出 重量为1和2的组合 因此至少拿出2块 输出 2
4
1 1 2 2 1
-1总和为7 为奇数 不可能均分, 输出-1

解析

  1. 这个题理解起来简单,看起来也简单,但是写代码时就容易找不清方向了。
  2. 首先 输入的数字可以求总和,和为偶数 不可能均分 输出-1 结束
  3. 其次 就得开始来组合,至于这个组合怎么去组合,我目前也只想到了数位DP算法,不懂的可以去我的专栏【算法】里面找。使用该算法的话,需要明确的一点是,其实我只需要取出的重量是总和的一半就可以了,不需要计算拿给S多少,W多少。那么例如输入 1 2 3 4
    第一次选择:有四种 1 2 3 4
    第二次选择: 若第一次选1 第二次选择可选 2 3 4 同理 其示意图可以表述为

在这里插入图片描述
比如 输入 1 2 3 4 时 如果 第一次取 1 第二次取 2 第三次取 3 三次和为6,超过一半 肯定后面就不往下取了 如果第一次取 2 第二次取3 和为5 刚好,那么2开头的也不往下取了 一次类推,找出所有的可能,并记录最小次数即可。
4. 这个题目中,难点在于数位DP算法,怎么使用且使用时,数组只有一个,因此需要记录前面取到过的索引,组合中值可能重复(重量可能相等),但是索引肯定不重复。

示例代码

import java.util.Scanner;

//MELON的难题
public class T62 {
	static int avg = 0;//
	static int[] tempNum = null;// 取到的数
	static int minCount = 0;
	static int nums[] = null;
	static int tempIndex[] = null;// 取了哪些索引

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int num = Integer.parseInt(sc.nextLine());
		nums = new int[num];
		int sum = 0;
		for (int i = 0; i < num; i++) {
			nums[i] = sc.nextInt();
			sum += nums[i];
		}
		if (sum % 2 != 0) {
			System.out.println(-1);
			System.exit(0);
		}
		avg = sum / 2;
		tempNum = new int[num];
		tempIndex = new int[num];
		for (int i = 0; i < num; i++) {
			tempIndex[i] = -1;
		}
		minCount = num;
		dfs(0, 0);
		System.out.println(minCount);
	}

	public static void dfs(int p, int count) {
		int tempSum = 0;
		for (int i = 0; i < count; i++) {
			tempSum += tempNum[i];
			if (tempSum == avg) {
				if (minCount > count) {
					minCount = count;
				}
				break;
			}
			if (tempSum > avg) {
				// 超了
				return;
			}
		}
		for (int j = 0; j < nums.length; j++) {
			boolean flag = false;
			for (int k = 0; k <= count; k++) {
				if (tempIndex[k] == j) {
					flag = true;
					break;
				}
			}
			if (!flag) {
				tempNum[count] = nums[j];
				tempIndex[count] = j;
				dfs(p + 1, count + 1);
			}
		}
	}
}

代码运行截图
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

SN74LVC2T45使用说明

DIR高电平&#xff0c;允许从A传输到B&#xff0c;而低电平则允许从B传输到A。 针脚A和DIR以VCCA为基准&#xff0c;针脚B以VCCB为基准

PACS影像系统源码:三维后处理解决方案

一、三维后处理功能是临床数字技术中的重要组成部分&#xff0c;在与PACS系统整合后,能帮助医院构建完整的影像管理及三维影像后处理平台&#xff0c;实现在任意PACS终端进行三维影像后处理工作。 二、三维后处理解决方案是指对三维医学影像数据进行加工处理&#xff0c;以提取…

【C/C++套接字编程】UDP通信实验

目录 一、实验目的&#xff1a; 二、实验内容简要描述 三、实验步骤与结果分析 四、结论 系列博客 【C/C套接字编程】套接字的基本概念与基础语法_Mr_Fmnwon的博客-CSDN博客 【C/C套接字编程】TCP协议通信的简单实现_Mr_Fmnwon的博客-CSDN博客 【C/C套接字编程】UDP协议通信…

Springboot实现接口传输加解密

前言 先给大家看下效果&#xff0c;原本我们的请求是这样子的 加密后的数据传输是这样子的 加解密步骤&#xff1a; 1.前端请求前进行加密&#xff0c;然后发送到后端 2.后端收到请求后解密 3.后端返回数据前进行加密 4.前端拿到加密串后&#xff0c;解密数据 加解密算法&…

新增一个全局处理异常

要在Java应用程序中理新增一个全局处理异常&#xff0c;通常需要执行以下三个步骤&#xff1a; 1.定义全局异常处理器&#xff08;Global Exception Handler&#xff09;&#xff1a; 创建一个类&#xff0c;实现ExceptionHandler接口或使用ControllerAdvice注解&#xff0c;用…

同步模式之保护性暂停

目录 定义 基本实现 带超时版 GuardedObject 多任务版 GuardedObject 总结 定义 即 Guarded Suspension&#xff0c;用在一个线程等待另一个线程的执行结果 要点 有一个结果需要从一个线程传递到另一个线程&#xff0c;让他们关联同一个 GuardedObject如果有结果不断从一…

SpringBoot 实现定时任务动态管理,太爽了

SpringBoot的定时任务的加强工具&#xff0c;实现对SpringBoot原生的定时任务进行动态管理,完全兼容原生Scheduled注解,无需对原本的定时任务进行修改。 快速使用 具体的功能已经封装成SpringBoot-starter即插即用&#xff1a; <dependency><groupId>com.github…

(CVPR-2017)用于目标检测的特征金字塔网络

用于目标检测的特征金字塔网络 论文题目&#xff1a;Feature Pyramid Networks for Object Detection 论文是FAIR发表在CVPR 2017的工作 paper地址 Abstract 特征金字塔是识别系统中用于检测不同尺度对象的基本组件。但最近的深度学习对象检测器避免了金字塔表示&#xff0c;部…

GPT提示词系统学习-第一课-你竟然想不到一个3位数乘法GPT会算错的原因

开篇 在我这个系统的开篇“GPT使我变成超人”中说过,什么样的人使用AI才是起到决定作用的。AI只是工具,它不是万能。使用的人决定了AI可以带什么样的效果。一个很强的人当使用GPT时会形成1+1>2的效果。 因此,提示词的系统化学习是非常重要。这一门课是任何目前国内市面…

使用omp并行技术实现矩阵乘法

矩阵乘法&#xff1a; OpenMP基本概念 OpenMP是一种用于共享内存并行系统的多线程程序设计方案&#xff0c;支持的编程语言包括C、C和Fortran。OpenMP提供了对并行算法的高层抽象描述&#xff0c;特别适合在多核CPU机器上的并行程序设计。编译器根据程序中添加的pragma指令&…

Unity基础 视频组件VideoPlayer,视频的播放与控制

在Unity中&#xff0c;视频播放功能具有广泛的应用&#xff0c;以下是一些视频播放在Unity中的常见用途&#xff1a; 游戏引入和过场动画&#xff1a;使用视频播放可以在游戏开始或过场动画中添加引人注目的视频&#xff0c;为游戏制造氛围和引起玩家的兴趣。这种方式可以通过播…

【运维知识进阶篇】zabbix5.0稳定版详解2(自定义监控+报警+图形+模板)

zabbix内容很多&#xff0c;这篇文章继续给大家介绍&#xff0c;zabbix功能很强大&#xff0c;只要是能获取到的数据都可以监控&#xff0c;俗称万物可监控&#xff0c;这也就决定了zabbix有很大的自由度&#xff0c;本篇文章包括自定义监控&#xff0c;自定义报警&#xff0c;…

分类预测 | MATLAB实现PSO-DBN粒子群优化深度置信网络多输入分类预测

分类预测 | MATLAB实现PSO-DBN粒子群优化深度置信网络多输入分类预测 目录 分类预测 | MATLAB实现PSO-DBN粒子群优化深度置信网络多输入分类预测效果一览基本介绍模型描述程序设计参考资料效果一览

LC-1262. 可被三整除的最大和(状态机DP)

1262. 可被三整除的最大和 难度中等229 给你一个整数数组 nums&#xff0c;请你找出并返回能被三整除的元素最大和。 示例 1&#xff1a; 输入&#xff1a;nums [3,6,5,1,8] 输出&#xff1a;18 解释&#xff1a;选出数字 3, 6, 1 和 8&#xff0c;它们的和是 18&#xff…

图的操作算法详解

一.图 基础概念&#xff1a; 有向图 - 图中每个边都有一个方向&#xff0c;例如社交媒体网站上的关注关系图就是有向图。无向图 - 图中每个边都没有方向&#xff0c;例如朋友之间的相互认识关系图可以是无向图。简单图 - 没有自环和重复边的无向图或有向图&#xff0c;例如一…

025.【树形结构算法】

1. 树的定义 树形结构是由n个元素组成的有限集合&#xff0c;如果n0&#xff0c;那么就称为空树&#xff1b;如果n>0&#xff0c;树形结构应该满足以下条件&#xff1a; 有一个特定的结点&#xff0c;称为根结点或根。 除根结点外&#xff0c;其余结点被分成m(m≥0)个互不…

面试官:一个 TCP 连接可以发多少个 HTTP 请求?

目录 &#x1f914; 第一个问题 &#x1f914; 第二个问题 &#x1f914; 第三个问题 &#x1f914; 第四个问题 &#x1f914; 第五个问题 曾经有这么一道经典面试题&#xff1a;从 URL 在浏览器被被输入到页面展现的过程中发生了什么&#xff1f; 相信大多数准备过的同…

产品经理面试常见的25个必问题(一)

1、你认为产品经理的工作职责是什么&#xff1f; ●需求阶段&#xff08;需求收集、需求管理、需求分析、需求评估&#xff09; ●设计阶段&#xff08;业务流程、功能模块、原型交互、需求文档&#xff09; ●开发阶段&#xff08;需求评审、项目管理、测试验收&#xff09…

centos版本的EDA虚拟机搭建1

0、参考博客 Centos镜像国内最全下载地址 VMware Workstation CPU如何设置才更加合理&#xff1f;如何才能发挥虚拟机最大性能 1、下载网站 http://mirrors.aliyun.com/centos/7/isos/x86_64/centos镜像文件下载完成。 2、vmware搭建centos 新建虚拟机。 选择自定义。 …

mysql中的索引

1、索引是什么&#xff1f; 在mysql当中&#xff0c; 内部系统它有两种查询方式&#xff0c; 一种是(全盘扫描查询)&#xff0c;另外一种是通过(索引检索查询)&#xff0c;通过添加了索引的字段进行查询&#xff0c; 可以大大提高查询效率 mysql中的索引相当于一本书中的目录&a…