Java 从N个项目中选择M个项目,以使完成这些M个项目的任务所需的时间最短

Java 从N个项目中选择M个项目,以使完成这些M个项目的任务所需的时间最短,java,algorithm,data-structures,dynamic-programming,greedy,Java,Algorithm,Data Structures,Dynamic Programming,Greedy,我试图解决以下问题: 您将获得N个项目。每个项目包含三个任务A、B和C。完成任务A所需的时间为TA,任务B为TB,任务C为TC。现在,我们必须选择M个项目,以使完成这些M个项目的任务所需的时间最短。规则如下: 所有选定的M项同时操作,即所有M项的任务在同一时刻操作 除非所有M个项目的任务A完成,否则无法启动任何选定项目的任务B 除非所有M个项目的任务B完成,否则无法启动任何选定项目的任务C 例如: if say N = 3 and M = 2 (it means we must select M

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

所有选定的M项同时操作,即所有M项的任务在同一时刻操作 除非所有M个项目的任务A完成,否则无法启动任何选定项目的任务B 除非所有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,这是我们能找到的最小可能组合

我试着想出一个解决这个问题的动态编程解决方案。但我无法找到问题的具体解决方案。有人能帮我解决这个问题吗

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

提前谢谢。

通过贪婪法解决方案权重计算+截止日期排序

这里有一个贪婪的方法来解决这个问题,我希望它能有所帮助。祝你好运

由于一个项目中的每个任务都需要时间T才能完成,因此我们可以将其视为这些任务A、B和C的截止日期。我们可以想象这些截止日期,就好像它们是一系列插槽中的插槽一样

为了可视化这些期限,考虑这些例子; 项目2的任务A

0\u A\u 1\u A\u 2\u A\u 3

项目1的任务C

0_______1____2

我们现在就考虑这个问题;我们手上有K个插槽0\uuuuu 1\uuuu 2\uuuuu__这个问题要求我们尽可能少地使用插槽

另一个例子来自你的解释,当你选择项目1和项目3时,我们的插槽采用了这种形式

第1项+第3项截止时间槽占用

0_A_1_A_2_A_3_B_4_B_5_C_6_C_7

前三个插槽被占用,因为item3的任务A比item1花费的时间长3个单位。任务B只能在较长的任务A完成时启动,因此从插槽3开始

因此问题就成了这个,;用最少的插槽数量填充我们的插槽。因此,我们将采取贪婪的方法来解决这个问题

为M个我们想从N个项目中选择的项目查找单个截止日期时段 在您提供的示例中

第1项

0_A_1_B_2_B_3_C_4_C_5

已占用5个插槽

第2项; 已占用8个插槽

第3项; 已占用6个插槽

对于itemX; P插槽已占用,等等

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

榜样; 当M=2时,供M项选择

项目1-2=5

项目1-3=3

项目2-3=4

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

因此,对于M=2的选择,我们取最小结果3,这导致我们选择项目1和项目3作为解决方案


这个数字将为我们提供使用的插槽的最小数量。因此,这就引出了解决方案。

限制:1-发布您迄今为止尝试过的内容会有所帮助,即使您没有要求提供Code,您能帮助我理解接受答案中的新减法吗?它如何处理输入[{2,2,2},{2,2,2},{3,3,3},{3,3}],M=2?按照我的理解,Item1-Item2=0,但也有Item3-Item4=0,那么我们如何选择更好的一个,即Item1,Item2?我不理解你的算法。你能解释一下它是如何处理输入[{2,2,2},{2,2,2},{3,1,1},{1,3,1}],M=2的吗?根据我对你的算术运算的理解,我们会看到第3项和第4项得到5+5=10,然后选择第1项和第2项,第1项和第2项得到6+6=12。但是,正如我所理解的,解决方案应该是项目1和项目2,它们总共产生6个,而项目3和项目4总共产生7个。是的,你是对的,我需要对贪婪方法采取不同的方法,而不是加法,因为示例要求我们花费最小的空间。非常感谢你发现了这个错误,它真的帮助我完全掌握了答案。多亏了你,我把答案编辑成正确的方向。这为您的示例和我们朋友的问题提供了解决方案。谢谢!。这是Google-SWE实习生在线评估中提出的问题。顺便说一句,感谢您的解释。但是我还是不懂新的减法 关于方法。你能解释一下它是如何处理输入[{2,2,2},{2,2,2},{3,3,3},{3,3}],M=2的吗?按照我的理解,Item1-Item2=0,但Item3-Item4=0,那么我们如何选择更好的一个,即Item1,Item2?