如何使用javascript找到从A点到B点完成这项工作的最少旅行次数?
Posted
技术标签:
【中文标题】如何使用javascript找到从A点到B点完成这项工作的最少旅行次数?【英文标题】:How to find minimum number of trips to do in order to complete this work from point A to point B using javascript? 【发布时间】:2021-03-01 08:45:00 【问题描述】:所以我正在解决这个问题:
有些袋子可以承载 1 到 3 个单位的重量,我必须将它们从 A 点搬运到 B 点。 以数组形式给出袋子的重量。所有重量均小于 3 个单位。
weights = [1, 1.78, 2.2, 2.73, 3]
所以我必须让携带行李的旅行总重量不要超过 3 个单位。为此,我必须进行最少的旅行次数。
示例: 权重 = [1.01, 1.99, 2.5, 1.5, 1.01]
我可以在至少 3 次旅行中携带所有行李:
[1.01 + 1.99, 2.5, 1.5 + 1.01]。
表示如何确定最小编号。从 A 点到 B 点携带重量袋的行程?
可以应用什么逻辑?
【问题讨论】:
对不起,*** 的重点不是为您编写代码。您需要尝试一些东西,展示您的尝试和努力,如果您特别卡在某个地方,我们可以帮助您使您的代码正常工作。但你不能只是来这里说“这是个问题,请写出解决方案。” 是的,我试过了。我会发布我的答案。 请阅读“背包问题”en.wikipedia.org/wiki/…。 【参考方案1】:一种方法是遍历一个排序列表,并始终首先挑选出最大的数字。
然后循环遍历剩余的元素并将其与最大的数字组合,其中组合总和小于您的目标。
由于最大的数字应该始终是最难“配对”的,这应该为您提供最佳的旅行次数。
但是,这种方法并不能均匀地分配权重。这将有利于包装对尽可能大。
这是一个简单的实现:
function SplitToBalancedPairs(inputs, target)
let outputs = [];
inputs = inputs.slice(0).sort((a, b) => a - b);
while (inputs.length > 0)
let a = inputs.pop();
let b;
let c;
for (let i = 0; i < inputs.length; i++)
b = inputs[i];
if (a + b <= target)
c = i;
break;
if (c !== void 0)
outputs.push([a, inputs.splice(c, 1).pop()]);
else
outputs.push([a]);
return outputs;
//Test
let weights = [1, 1.78, 2.2, 2.73, 3];
let results = SplitToBalancedPairs(weights, 3);
console.log(results);
console.log(results.map(a => a.reduce((b, c) => b + c)));
【讨论】:
但是有多少次旅行?如何计算它们?我不是在问组合?? @Biku7 结果对列表的长度将是您的旅行次数。对于上面示例中的列表,它将是 4 次行程。【参考方案2】:我在这里使用了贪婪的方法,即对权重数组进行排序,并将最重的与最轻的和较轻的组合在一起,直到达到极限。 Python代码:
def solve(A):
A.sort()
n = len(A)
i =0
j = n-1
ans=0
while i<=j:
while A[i]+A[j] <=3:
i+=1
ans+=1
j-=1
return ans
print(solve([1.01, 1.99, 2.5, 1.5, 1.01]))
时间复杂度:O(n)
【讨论】:
但这不是javascript 是的,但是逻辑也被问到了,所以我认为它可能会有所帮助:)以上是关于如何使用javascript找到从A点到B点完成这项工作的最少旅行次数?的主要内容,如果未能解决你的问题,请参考以下文章