专栏导读
本专栏收录于《华为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]]
四、补充说明
- 对于给定输入,产品组合少于150种。输出的组合为一个数组,数组的每个元素也是一个数组,表示一种组合方案。如果给定产品无法组合金额为amount元的方案,那么返回空列表。
- 两种组合方案,只要存在一种产品的数量不同,那么方案认为是不同的。
- 每种产品型号价格不相同
- 1 <= 产品类型数量 <= 30
- 100 <= 产品价格 <= 20000
- 100 <= 采购金额 <= 50000
五、解题思路
- 读取输入的采购金额amount和产品价格列表price。
- 将价格列表price解析为整数数组priceArr。
- 创建一个全局变量pricesList,用于存储所有可能的产品组合。
- 调用递归函数getGroupPrice,传入参数priceArr、0、amount和一个空列表priceList。
- 如果剩余采购金额remainMount小于0,说明当前组合不满足条件,直接返回。
- 如果剩余采购金额remainMount等于0,说明当前组合满足条件,将priceList加入pricesList中。
- 如果剩余采购金额remainMount大于0,说明还有采购金额,从当前位置index开始循环遍历价格列表priceArr。
- 将当前价格加入priceList中。
- 调用递归函数getGroupPrice,传入参数priceArr、i、remainMount减去当前价格,以及更新后的priceList。
- 移除priceList最后一个元素,以便尝试下一个价格。
- 输出所有可能的产品组合。遍历pricesList,对于每个组合,输出一个列表形式的字符串。
- 遍历当前组合的价格列表subcur,输出每个价格。
- 如果不是当前组合的最后一个价格,输出逗号和空格。
- 如果不是最后一个组合,输出逗号和空格。
- 完成输出。
六、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分 考生抽中题】
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。