当前位置: 首页 > 面试题库 >

从N个项目中选择M个项目,以使完成这些M个项目的任务花费的时间最少

胥和悌
2023-03-14
问题内容

我正在尝试解决以下问题:给您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时,我们的广告位采用了这种形式;

item1 + item3“截止时间槽占用”

0_A_1_A_2_A_3_B_4_B_5_C_6_C_7

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

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

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

在示例中,您提供了;

对于项目1;

0_A_1_B_2_B_3_C_4_C_5

占用5个插槽

对于项目2; 占用8个插槽

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

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

在知道每个项目对任务时间要求的插槽数量之后,我们将在N个项目任务时间之内检查M个 减法 项作为项目的组合,以获取最小的数量。

例; 当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作为解决方案。

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



 类似资料:
  • 问题内容: 使用标准列表,我尝试选择最后2个列表项。我有多种排列方式,但似乎没有什么可以选择最后2种: 我知道类似CSS3的新选择器,但如果可能的话,我更喜欢一些可以在更多浏览器中使用的选择器(不必特别在意IE)。 问题答案: 这将选择列表的最后两个项目:

  • 问题内容: 我有一个项目数据库。每个项目都按类别表中的类别ID进行分类。我正在尝试创建一个列出每个类别的页面,并在每个类别下方显示该类别中的4个最新项目。 例如: 宠物用品 宠物食品 我知道我可以通过查询数据库来轻松解决此问题,如下所示: 然后遍历该数据并查询数据库中的每个类别以获取最新的项目: 我要弄清楚的是,我是否可以仅使用1个查询并获取所有这些数据。我有33个类别,因此我认为这可能有助于减少

  • 问题内容: | uId | title | amount | makers | widgets | 1 richard 998 xcorp sprocket 2 swiss 995 ycorp framitz 3 ricky 90 zcorp flobber 4 ricky2 798 xcorp framitz 1 lilrick 390 xcorp sprocket 1 brie 200 mco

  • 这一章将通过一个例子来介绍Gradle的强大特性,你将从中学到怎么用Gradle的标准插件来引导、配置和运行你的应用,这章结束的时候你应该对Gradle的工作机制有个清晰的认识。 The To Do Application 我们经常需要同时管理多个项目,有时候会发现多个项目很难维护达到了难以控制的地步,为了摆脱这个困惑,我们可以维护一个to-do列表,显然你可以把你所有要完成的任务写在一张纸上,当

  • 问题内容: 假设我有一个会议实体。每个会议都有一个与会者和一个会议日期。在我的会议表中,我可能会为每个与会者召开多个会议,每个会议的日期都不同。我需要一个JPA查询,该查询将仅为所有与会者选择最新的会议。例如,如果我的桌子看起来像这样 我的结果应该是 针对postgres使用JPA 2。会议有1-1个出席者和一个简单的时间戳记日期。我怀疑我需要和max(blah)做一个小组,也许还需要加入我自己的

  • 我正在构建一个定制的Java库。我把我的大部分“重复”代码都保存在那里,比如文件处理、字符串处理等。每次我想使用它们时,我都必须将该类复制并粘贴到我正在进行的其他项目中。有没有办法让这个自定义库类成为“依赖项”?我在用我的智能手机。