从N个项目中选择M个,以便完成这些M个项目所需的时间最少

问题描述

我正在尝试解决以下问题: 您将获得N个物品。每个项目包含三个任务A,B和C。完成任务A所需的时间为TA,任务B为TB,任务C为TC。现在,我们必须选择M项,以便完成这些M项的任务所需的时间最少。这是规则:

  1. 同时选中所有M个项目,即同时操作所有M个项目
  2. 除非所有M个项目的任务A完成,否则任何选定项目的任务B都无法启动
  3. 除非所有M个项目的任务B完成,否则任何选定项目的任务C都无法启动

例如:

if say N = 3 and M = 2 (it means we must select M items out of 3 items in total)
         Tasks: A  B  C
       item 1 : 1  2  2
       item 2 : 3  4  1
       item 3 : 3  1  2

如果我们选择项目1和项目3,则两个项目的任务A在3个单位后完成(项目1等待项目3完成),然后两个项目的任务B在接下来的2个单位时间后完成。同样,任务C在2个单位时间后完成。因此总时间为7(这是我们可以找到的最小组合)

我尝试过考虑针对该问题的动态编程解决方案。但是我无法得到这个问题的具体解决方案。任何人都可以通过提供有效的解决方案来帮助我。

PS:请不要编写代码。我只是在这里寻找逻辑。

谢谢。

解决方法

贪婪方法(重量计算+截止日期排序)

这里是解决此问题的贪婪方法,希望对您有所帮助。祝你好运!

由于一个项目中的每个任务都需要时间T才能完成,因此我们可以将其视为这些任务(A,B和C)的“最后期限”。而且,我们可以将这些截止日期形象化,就像它们是一个插槽/一系列插槽中的“插槽”一样。

为了可视化这些截止日期,请考虑以下示例;

项目2的任务A;

0__A__1__A__2__A__3

项目1的任务C;

0__C__1__C__2

让我们现在考虑一下;我们的手0__1__2__ ... __K内有K个“插槽”,该问题要求我们花最少的插槽空间。

您的说明中的另一个示例可以更好地可视化问题,当您选择item1和item3时,我们的广告位采用了这种形式;

项目1 +项目3“截止时间槽占用”

0_A_1_A_2_A_3_B_4_B_5_C_6_C_7

由于项3的任务A比项1长3个单位,因此前三个槽被占用。任务B仅在完成“较长”任务A后才能启动,因此从插槽号3开始。

因此问题就出在这里;在我们的广告位中填满最少要使用的广告位。因此,我们将对此问题采取贪婪的态度。

  • 为我们要从N个项目中选择的M个项目找到单独的“最后期限”

在您提供的示例中;

对于item1;

0_A_1_B_2_B_3_C_4_C_5

已占用5个插槽

对于item2; 占用了8个插槽

对于项目3; 占用6个插槽

对于itemX; P插槽已占用,依此类推。...

知道每个项目在任务时间上需要的插槽数量后 我们将在N个项目任务时间内检查M个 Subtractions 作为项目的组合,以获得可能的最小编号。

示例; 当M = 2时可供M个项目选择;

Item1-Item2 = 5;

Item1-Item3 = 3;

Item2-Item3 = 4;

**编辑;项目1-项目2对应于所选项目数量组合中的减法绝对值;例如,如果M = 2; | a1-a2 | + | b1-b2 | + | c1-c2 | ...

因此,对于M = 2个选择,我们采用最小值3,这导致我们选择Item1和Item3作为解决方案。

此数字将为我们提供使用的最小插槽数。因此,这导致我们找到解决方案。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...