华机 硬件产品销售方案 js实现

67 阅读2分钟

题目描述:

某公司目前推出了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;
  }
})();