我正在尝试计算要放在杠铃上的最佳板块,以达到所需的重量。它运作良好,但问题在于它将始终在目标重量下找到第一个可能的重量

例如,如果您想让杠铃称重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

最佳答案

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

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

但是,考虑到您当前的实现方式,我将执行以下操作:

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

关于javascript - 计算杠铃获得特定重量所需的重量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44665763/

10-13 00:10