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

标签 javascript arrays algorithm

我正在尝试计算一组最佳的板来放在杠铃上以达到所需的重量。它运行良好,但问题是它总是会找到第一个可能的重量低于目标重量。

例如,如果您希望您的杠铃重 29kg,您可以将 27.5kg30kg 给定下面的一组盘子,其中每个板 block 都被假定为一对。知道这两个选项后,您会选择 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/

相关文章:

python - 如何即时判断 '0'到 '9'在特定范围内被使用了多少次

Javascript:从数组中获取索引值

javascript - TypeScript 属性 'navigation' 类型中缺失,但类型 'Props' React Native 中需要

javascript - 为 vuejs 项目导入/导出 javascript 变量

ruby-on-rails - Ruby 数组转换为带括号的字符串

初始化 2D struct char 数组的正确方法

javascript - 简写 if 语句总是返回 true

java - 将数据从较长的数组复制到较短的数组

algorithm - 如何设计一种允许在O(1)时间内搜索,插入和删除整数X的数据结构

python - K-最大元素算法比较