Javascript 计算杠铃获得特定重量所需的重量

Javascript 计算杠铃获得特定重量所需的重量,javascript,arrays,algorithm,Javascript,Arrays,Algorithm,我正试图计算一组最佳的盘子,以使杠铃达到所需的重量。它工作得很好,但问题是它总是会在目标重量下找到第一个可能的重量 例如,如果你想让你的杠铃重29kg,你可以将27.5kg或30kg放在下面给定的一组板上,其中每个板假定为一对。一旦您知道这两个选项,您将选择30kg,因为它比27.5更接近29 在本例中,我只是让它计算27.5,但我还没有弄清楚如何返回并计算if语句失败后可能的最接近权重 const BAR = 20; const PLATES = [ 1.25, 2.5, 2.5

我正试图计算一组最佳的盘子,以使杠铃达到所需的重量。它工作得很好,但问题是它总是会在目标重量下找到第一个可能的重量

例如,如果你想让你的杠铃重
29kg
,你可以将
27.5kg
30kg
放在下面给定的一组板上,其中每个板假定为一对。一旦您知道这两个选项,您将选择
30kg
,因为它比
27.5
更接近
29

在本例中,我只是让它计算
27.5
,但我还没有弄清楚如何返回并计算if语句失败后可能的最接近权重

const BAR = 20;

const PLATES = [
  1.25,
  2.5,
  2.5,
  5,
  5,
  10,
  10,
  20,
  20,
];

const sumPlates = (plates) => {
  return plates.reduce((acc, plate) => {
    return acc + (plate * 2);
  }, 0);
};

const rack = (targetWeight) => {
  const sortedPlates = PLATES.sort((a, b) => b - a);

  const rackedPlates = sortedPlates.reduce((acc, plate) => {
    if ((BAR + (plate * 2) + sumPlates(acc)) > targetWeight) {
      // Calculate here the closest possible rack weight
      return acc;
    }

    acc.push(plate);

    return acc;
  }, []);

  return {
    targetWeight,
    barbellWeight: BAR + sumPlates(rackedPlates),
    plates: rackedPlates,
  };
};

console.log(rack(47)); // gives 45 but should give 47.5
console.log(rack(29)); // gives 27.5 but should give 30

它实际上是a的一个修改版本,它本身就是背包问题的一个修改版本

根据给定权重的大小和类型,您可以在链接中使用动态规划解决方案来查找所有可能的组合,并执行
O(N)
迭代以查找最接近目标权重的组合


但是,考虑到您当前的实施情况,我将只执行以下操作:

var x = rack(targetSum);
var y = rack(2*targetSum - x);
ans = the closer one to targetSum 

嘎,我在问这个问题的时候想不起问题的名字,但是谢谢你提醒我!没问题,不过我认为我的答案的第二部分是一个更好的选择。