我试图计算最好的一组牌以放在杠铃上以达到所需的重量。它运作良好,但问题是它总能找到第一个可能的重量 目标重量。
例如,如果您希望杠铃称重29kg
,您可以将27.5kg
或30kg
放在下面的一组牌照中,其中每个牌照都假定是一对。了解这两个选项后,您可以选择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
答案 0 :(得分:1)
它实际上是Change-making problem的修改版本,它本身就是背包问题的修改版本。
根据给定权重的大小和类型,您可以在链接中使用动态编程解决方案来查找所有可能的组合,并执行O(N)
迭代以找到与目标权重最接近的一个。
然而,鉴于您目前的实施情况,我将执行以下操作:
var x = rack(targetSum);
var y = rack(2*targetSum - x);
ans = the closer one to targetSum