华为OD机试 - 硬件产品销售方案 - 回溯(Java 2023 B卷 200分)-LMLPHP

专栏导读

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

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

一、题目描述

某公司目前推出了AI开发者套件、AI加速卡、AI加速模块、AI服务器、智能边缘多种硬件产品,每种产品包含若干个型号。

现某合作厂商要采购金额为amount元的硬件产品搭建自己的AI基座。

假设当前库存有N种产品,每种产品的库存量充足,给定每种产品的价格,记为price(不存在价格相同的产品型号)。

请为合作厂商列出所有可能的产品组合。

二、输入描述

输入包含采购金额amount和产品价格列表price。

第一行为amount,第二行为price。

例如:

500
[100, 200, 300, 500]

三、输出描述

输出为组合列表。

例如:

[[500], [200, 300], [100, 200, 200], [100, 100, 300], [100, 100, 100, 200], [100, 100, 100, 100, 100]]

四、补充说明

  1. 对于给定输入,产品组合少于150种。输出的组合为一个数组,数组的每个元素也是一个数组,表示一种组合方案。如果给定产品无法组合金额为amount元的方案,那么返回空列表。
  2. 两种组合方案,只要存在一种产品的数量不同,那么方案认为是不同的。
  3. 每种产品型号价格不相同
  4. 1 <= 产品类型数量 <= 30
  5. 100 <= 产品价格 <= 20000
  6. 100 <= 采购金额 <= 50000

五、解题思路

  1. 读取输入的采购金额amount和产品价格列表price。
  2. 将价格列表price解析为整数数组priceArr。
  3. 创建一个全局变量pricesList,用于存储所有可能的产品组合。
  4. 调用递归函数getGroupPrice,传入参数priceArr、0、amount和一个空列表priceList。
    • 如果剩余采购金额remainMount小于0,说明当前组合不满足条件,直接返回。
    • 如果剩余采购金额remainMount等于0,说明当前组合满足条件,将priceList加入pricesList中。
    • 如果剩余采购金额remainMount大于0,说明还有采购金额,从当前位置index开始循环遍历价格列表priceArr。
      • 将当前价格加入priceList中。
      • 调用递归函数getGroupPrice,传入参数priceArr、i、remainMount减去当前价格,以及更新后的priceList。
      • 移除priceList最后一个元素,以便尝试下一个价格。
  5. 输出所有可能的产品组合。遍历pricesList,对于每个组合,输出一个列表形式的字符串。
    • 遍历当前组合的价格列表subcur,输出每个价格。
    • 如果不是当前组合的最后一个价格,输出逗号和空格。
    • 如果不是最后一个组合,输出逗号和空格。
  6. 完成输出。

六、Java算法源码

// 所有可能的产品组合
static List<List<Integer>> pricesList = new ArrayList<>();

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    // 采购金额amount
    int amount = Integer.valueOf(sc.nextLine());

    // 产品价格列表price
    String price = sc.nextLine();
    // [100, 200, 300, 400]
    int[] priceArr = Arrays.stream(price.substring(1, price.length() - 1).split(",")).map(o->o.trim()).mapToInt(Integer::parseInt).toArray();

    getGroupPrice(priceArr, 0, amount, new ArrayList<>());
    System.out.print("[");
    for (int i = 0; i < pricesList.size(); i++) {

        List<Integer> subcur = pricesList.get(i);
        System.out.print("[");

        for (int j = 0; j < subcur.size(); j++) {
            System.out.print(subcur.get(j));
            if (j != subcur.size() - 1) {
                System.out.print(", ");
            }
        }
        System.out.print("]");
        if (i != pricesList.size() - 1) {
            System.out.print(", ");
        }
    }
    System.out.print("]");
}

/**
 *
 * @param priceArr 产品价格列表price
 * @param index
 * @param remainMount 剩余采购金额
 * @param priceList 满足条件的产品价格列表集合
 */
public static void getGroupPrice(int[] priceArr, int index, int remainMount, List<Integer> priceList) {
    if (remainMount < 0) {
        return;
    }

    // 如果刚好花完
    if (remainMount == 0) {
        List<Integer> tempList = new ArrayList<>();
        tempList.addAll(priceList);
        pricesList.add(tempList);
        return;
    }

    // 如果还有采购金额
    for (int i = index; i < priceArr.length; i++) {
        priceList.add(priceArr[i]);
        getGroupPrice(priceArr, i, remainMount - priceArr[i], priceList);
        priceList.remove(priceList.size() - 1);
    }
}

七、效果展示

1、输入

500
[100, 200, 300, 500, 500]

2、输出

[[100, 100, 100, 100, 100], [100, 100, 100, 200], [100, 100, 300], [100, 200, 200], [200, 300], [500], [500]]

3、说明

题目很简单,就是你有500块钱,随便采购,看一共能采购多少种组合的硬件产品。

华为OD机试 - 硬件产品销售方案 - 回溯(Java 2023 B卷 200分)-LMLPHP


🏆下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】

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

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

华为OD机试 - 硬件产品销售方案 - 回溯(Java 2023 B卷 200分)-LMLPHP

08-31 22:10