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

时间:2017-06-21 02:08:43

标签: javascript arrays algorithm

我试图计算最好的一组牌以放在杠铃上以达到所需的重量。它运作良好,但问题是它总能找到第一个可能的重量 目标重量。

例如,如果您希望杠铃称重29kg,您可以将27.5kg30kg放在下面的一组牌照中,其中每个牌照都假定是一对。了解这两个选项后,您可以选择30kg,因为它距离29更接近27.5

在这个例子中,我只是计算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

1 个答案:

答案 0 :(得分:1)

它实际上是Change-making problem的修改版本,它本身就是背包问题的修改版本。

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

然而,鉴于您目前的实施情况,我将执行以下操作:

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