题目描述:
某公司目前推出了AI开发者套件,AI加速卡,AI加速模块,AI服务器,智能边缘多种硬件产品,每种产品包含若干个型号。
现某合作厂商要采购金额为amount元的硬件产品搭建自己的AI基座。
例如当前库存有N种产品,每种产品的库存量充足,给定每种产品的价格,记为price(不存在价格相同的产品型号)。请为合作厂商列出所有可能的产品组合。
给定一行,代表一个工厂拥有的所有零件的价格,零件的库存无限量,例如:
[100,200,200,300,500] 代表工厂有5种零件,每种零件单价为100,200,200,300,500元
求出该企业能购买所有的零件组合。
输入描述:
第一行,正整数,企业拥有的钱总数。
第二行,工厂零件价格,逗号分隔的正整数。
输出描述:
以数组的格式输出所有可能的零件组合,不能包含重复的组合。
示例1:
输入:
500
100,200,200,300,500
输出:
[[100, 100, 100, 100, 100], [100, 100, 100, 200], [100, 100, 100, 200], [100, 100, 300], [100, 200, 200], [100, 200, 200], [100, 200, 200], [200, 300], [200, 300], [500]]
代码
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void (async function () {
// Write your code here
while ((line = await readline())) {
let amount = Number(line);
let str = await readline();
let prices = str.split(",").map(Number);
console.log(findCombinations(amount,prices));
}
function findCombinations(amount, prices) {
// 对价格进行排序
prices.sort((a, b) => a - b);
let result = [];
let currentCombination = [];
function backtrack(startIndex, currentSum) {
if (currentSum === amount) {
result.push(currentCombination.slice());
return;
}
if (currentSum > amount) {
return;
}
for (let i = startIndex; i < prices.length; i++) {
currentCombination.push(prices[i]);
backtrack(i, currentSum + prices[i]);
currentCombination.pop();
}
}
backtrack(0, 0);
return result;
}
})();