如何使用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点完成这项工作的最少旅行次数?的主要内容,如果未能解决你的问题,请参考以下文章

使用R,如何计算从一点到线的距离?

在 3D 中找到从点到截锥的最短向量

关于货仓选址问题的方法及证明(在数轴上找一点使得该点到所有其他点的距离之和最小)

如何找到直线和矩形的交点?

用c#实现,找出图中从一个点到另一个点的所有路径

默认情况下,我们如何从 Google Direction API 获得从 A 点到 B 点的最短距离路线