华为OD机试真题 Java 实现【组装新的数组】【2023Q1 200分】-LMLPHP

一、题目描述

给你一个整数M和数组N,N中的元素为连续整数,要求根据N中的元素组装成新的数组R。

组装规则:

  1. R中元素总和加起来等于M;
  2. R中的元素可以从N中重复选取;
  3. R中的元素最多只能有1个不在N中,且比N中的数字都要小(不能为负数)

二、输入描述

第一行输入是连续数组N,采用空格分隔;
第二行输入数字M;

三、输出描述

输出的是组装办法数量,int类型。

四、补充说明

1 <= N.length <= 30
1 <= N.length <= 1000

五、Java算法源码

/**
 * 给你一个整数M和数组N
 * 
 * N中的元素为连续整数,要求根据N中的元素组装成新的数组R
 * 
 * 1、R中元素总和加起来等于M
 * 2、R中的元素可以从N中重复选取
 * 3、R中的元素最多只能有1个不在N中,且比N中的数字都要小(不能为负数)
 */
// 组装办法数量
private static int sum = 0;
private static int min = Integer.MAX_VALUE;

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    // 连续数组N,采用空格分隔
    String[] N = sc.nextLine().split(" ");
    // 新数组R数字之和 = 数字M
    int M = sc.nextInt();

    // 数组N
    int[] arr = new int[N.length];
    for (int i = 0; i < N.length; i++) {
        arr[i] = Integer.parseInt(N[i]);
        // 取数组N的最小值
        min = Math.min(min, arr[i]);
    }
    get(0, arr, M, 0);
    System.out.println(sum);
}

/**
 *
 * @param idx
 * @param n 连续数组N,采用空格分隔
 * @param M 新数组R数字之和 = 数字M
 * @param rSum 新数组R数字之和
 */
public static void get(int idx, int[] n, int M, int rSum) {
    if (rSum == M) {
        sum++;
        return;
    }

    if (rSum > M) {
        return;
    }

    /**
     * R中的元素最多只能有1个不在N中,且比N中的数字都要小
     *
     * 新数组R数字之和 - 当前新数组R数字之和 <= 取数组N的最小值
     */
    if (M - rSum <= min - 1) {
        sum++;
        return;
    }

    for (int i = idx; i < n.length; i++) {
        get(i, n, M, rSum + n[i]);
    }
}

六、效果展示

1、输入

2 3 5
8

2、输出

5

3、说明

  1. 2 2 2 2
  2. 2 3 2 1
  3. 2 5 1
  4. 3 5
  5. 2 3 3

华为OD机试真题 Java 实现【组装新的数组】【2023Q1 200分】-LMLPHP


🏆下一篇:华为OD机试真题 Java 实现【投篮大赛】【2023Q1 100分】

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

本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。

华为OD机试真题 Java 实现【组装新的数组】【2023Q1 200分】-LMLPHP

05-24 21:33