一、题目描述
某公司目前推出了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
四、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 实现【服务中心选址】【2023Q1 100分 】
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。