华为OD机试 - 等和子数组最小和 - 深度优先搜索(Java 2022 Q4 100分)

news/2024/7/20 21:28:43 标签: 华为od, 深度优先, 算法, 七日集训, 学习方法

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出

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

专栏导读

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

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

给定一个数组nums,将元素分为若干个组,使得每组和相等,求出满足条件的所有分组中,组内元素和的最小值。

二、输入描述

第一行输入 m

接着输入m个数,表示此数组nums

数据范围:1<=m<=50, 1<=nums[i]<=50

三、输出描述

最小拆分数组和。

四、解题思路

虽然题意很简单,看着很简单,其实这道题是有点难度的,100分你能抽到这道题,自求多福吧,兄弟。

比如:

4 3 2 3 5 2 1

可以组合成

4 1
3 2
3 2
5

解题思路:

1、答案一定在最大值与所有数的和之间,拿到这个值看是否能够满足条件;

2、用深度优先搜索,搜索一种方法满足子数组合能够满足target值的解;

3、每次从上一次找的数后面的数开始递归,这个优化非常重要,不加的话会把之前的结果再找一遍,例如,我本次递归取了第2个数,然后下面再取第5个数,当我下次递归取了第5个数的时候,如果不从第5个数之后来选,就会搜到上面一样取到第二个数,那里的结果我们之前是已经搜索过了的。

五、Java算法源码

package com.guor.od;

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

public class OdTest05 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int m = Integer.valueOf(sc.nextLine());
        int[] nums = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        Arrays.sort(nums);
        // 求和
        int sum = 0;
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
        }

        // 答案一定在最大值与所有数的和之间,拿到这个值看是否能够满足条件
        for (int ans = nums[nums.length - 1]; ans <= sum; ans++) {
            if (dfs(ans, 0, nums, new HashSet<>(), 0)) {
                System.out.println(ans);
                break;
            }
        }
    }

    /**
     * 用深度优先搜索,搜索一种方法满足子数组合能够满足target值的解
     *
     * @param target   目标值
     * @param nowValue 当前递归中的数组和
     * @param nums     数组
     * @param useIndex 数组中已经使用过的数的下标
     * @param nowIndex 上一个取的数下标,用于搜索剪枝
     * @return 是否找到了答案
     */
    public static boolean dfs(int target, int nowValue, int[] nums, Set<Integer> useIndex, int nowIndex) {
        if (useIndex.size() == nums.length && nowValue == 0) {
            //只有当数组中的值已经用完,且没有剩下数的时候,说明答案已经找到了
            return true;
        }

        //每次从上一次找的数后面的数开始递归,这个优化非常重要,不加的话会把之前的结果再找一遍,
        //例如,我本次递归取了第2个数,然后下面再取第5个数,
        //当我下次递归取了第5个数的时候,如果不从第5个数之后来选,就会搜到上面一样取到第二个数,那里的结果我们之前是已经搜索过了的
        for (int i = nowIndex; i < nums.length; i++) {
            if (useIndex.contains(i)) {
                //表示这个数已经被用过了
                continue;
            }

            //只有当当前取的数 + 当前的和小于目标值时才可以取
            if (nowValue + nums[i] <= target) {
                //标记这个数已经用过了
                useIndex.add(i);
                if (nowValue + nums[i] == target) {
                    //当前的和已经等于目标值,这个时候我们要从头来找一个没有用过的数来继续搜索
                    if (dfs(target, 0, nums, useIndex, 0)) {
                        return true;
                    }
                } else {
                    //当前的和小于目标值,我们还得继续找数来继续填充我们的和
                    if (dfs(target, nowValue + nums[i], nums, useIndex, i)) {
                        return true;
                    }
                }
                useIndex.remove(i);
            }
        }
        return false;
    }
}

六、效果展示

1、输入

4 6 5 5 8 2 3 3 3 1

2、输出

8
在这里插入图片描述


🏆下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)

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

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述


http://www.niftyadmin.cn/n/5001141.html

相关文章

【Apollo】开启Apollo之旅:让自动驾驶如此简单

前言 Apollo 是百度公司推出的自动驾驶平台。它是一个综合性的自动驾驶解决方案&#xff0c;提供了包括感知、决策、规划和控制等核心功能&#xff0c;以及地图、定位、仿真、数据管理等配套工具。 文章目录 前言Apollo 的发展历程Apollo 8.0新特性软件包管理感知框架工具链小…

APS系统设计经验分享(时间推导II - 2023.09)

在前一篇关于APS系统设计分享文章(《APS系统设计经验分享(时间推导 - 2023.03)》)中&#xff0c;我们提到将会分享使用OptaPlanner作为规划引擎开发APS系统过程中&#xff0c;遇到的一些时间相关的设计建议与异常情况分析。后来一直忙于项目工作&#xff0c;直到现在才想起仍欠…

动态代理为接口增加实现,一文搞定Spring data 原理,你也可以这样玩!

目录 1、jpa的使用 2、spring data 的特点 3、jpa的简单使用 3.1 jpa简单使用 4、简单实现-原理 4.1 自己实现一个repo 4.2 实现代理接口 4.3 测试 4.4 看下结果 总结 好久不写&#xff0c;也是真写不下去&#xff0c;不知道为啥&#xff0c;总是开始想写&#xff0c…

创建10个线程并发执行(STL/Windows/Linux)

C并发编程入门 目录 STL 写法 #include <thread> #include <iostream> using namespace std;void thread_fun(int arg) {cout << "one STL thread " << arg << " !" << endl; }int main(void) {int thread_count 1…

volatile+SIGCHLD信号+可重入函数(了解)

索引 volatile1.gcc -O含义及其作用2.证明其内存可见性 深入理解SIGCHLD信号SIGCHLD总结 可重入函数 volatile 保存内存的可见性&#xff0c;告知编译器&#xff0c;该关键字修饰的变量不允许被优化&#xff0c;对该变量的任何操作都必须在内存中操作。 1.gcc -O含义及其作用…

数据结构前言

一、什么是数据结构&#xff1f; 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。 上面是百度百科的定义&#xff0c;通俗的来讲数据结构就是数据元素集合与数据元素集合或者数据元素与数据元素之间的组成形式。 举个…

Springboot - 11.容器集成

&#x1f440; Spring-boot-starter-web特性 ✌1. Spring MVC支持&#xff1a; spring-boot-starter-web模块提供了对Spring MVC&#xff08;Model-View-Controller&#xff09;框架的支持&#xff0c;使您能够构建基于MVC模式的Web应用程序。Spring MVC是一种在Web应用中组织…

ClickHouse多级磁盘和冷热数据分离实践

特别注意 ck可以大小写区分也可以不区分ck 配置文件中的各个卷的是有顺序的。 开启远程访问 vim /etc/clickhouse-server/config.xml <listen_host>0.0.0.0</listen_host> 前言 ClickHouse 的冷热数据分离和ES的类似&#xff0c;可以选择冷数据跑在哪个数据目录…