动态编程查找所有可能的团队组合

时间:2015-03-21 17:16:29

标签: algorithm dynamic-programming

我一直在尝试解决一个问题,我必须计算随机运动可能的团队编队数量。

输入是这样的:

P → Number of Team Players
R → Roles  
[Min, Max] → Role 0
[Min, Max] → Role 1
...
[Min, Max] → Role r-1
----------
Min= Minimum number of Players for the Role
Max= Maximum number of Players for the Role

以Sport1为例。让我们说Sport1作为3种角色(A,B,C),现在让我们想象每支球队有8名球员。

8 → Number of Team Players
3 → Roles  
[3 , 7] → Role A
[1 , 5] → Role B
[0 , 2] → Role C
  

有效的团队形成:   [3-5-03-4-13-3-24-4-04-3-14-2-25-3-05-2-1,{ {1}},5-1-26-2-06-1-1]

     

有效的团队形式数量:12

我已经通过了解每一个可能的阵型来解决这个问题,如果每个角色中的队员总数等于队员数量,那么在最终结果中添加一个。否则添加零a.k.a.对下一个组合做同样的操作,直到没有达到结束。

3 + 5 + 0 = 8→有效的团队组建

3 + 5 + 1> 8→无效的团队形成

3 + 4 + 0< 8→无效的团队形成


这一切都很有趣和游戏,直到玩家数量为40,角色数量为20,每个角色的Min = 0和Max = 40。

示例:

7-1-0

在这种情况下,我需要检查40 ^ 20个可能的编队,因为我已经做了一些削减,只做角色A 0然后乘以20,但仍然需要检查40 ^ 19种不同的组合。 / p>

必须使用动态编程解决此问题。我已经用DP来解决一些问题(序列问题,最大利润草莓箱),但似乎无法找到解决这个问题的方法。

有人可以说明如何解决这个问题和/或我可以在网上或书中发现的类似问题,这些问题可能会让我找到这方面的DP解决方案吗?

1 个答案:

答案 0 :(得分:0)

动态编程问题通常最终导致您按顺序排列问题的各个部分,以便您可以从左到右处理它们,在阶段n完成足够的工作,以便您可以在阶段参考它来获取所有信息的n + 1。

在这里,您可以将前n个角色视为前n个阶段,因此前n行如#34; [Min,Max]→Role 0"在你的例子中。在阶段n,我将计算,对于所有可用的最多P的球员数量,你可以使用前n个角色和最多这个数量的球员组成不同阵型的数量。

在第n + 1阶段,对于每个可用的球员数量,我会考虑角色n + 1中所有合法球员的数量。从我目前正在考虑的玩家数量中减去,我得到了许多玩家留下前n个角色,我查找存储在那里的答案,以获得前n个角色的不同编队的数量。添加这些可能性,我获得了总共使用该数量的玩家可以弥补前n + 1个角色的编队数量。很明显,我为所有数字重复这个以达到P以获得我需要为第n + 1阶段存储的答案 - 除非这是最后阶段,在这种情况下只需要P球员的答案。

如果您做出的决定可以分阶段从左到右排列,那么每个阶段的答案并不依赖于很多信息,并且可以从前几个阶段的答案中计算出来,那么动态编程通常是实用的解决问题的方法。如果您准备在每个阶段存储和计算大量可能性,您几乎可以将任何问题转化为动态编程问题,但最终这个数字变得如此之大以至于所谓的解决方案变得非常不切实际。

作为一个例子,在顶部的问题中,第二阶段是仅有两个角色A和B的以下问题。

[3,7]→角色A

[1,5]→角色B

在最初的问题中,如果P = 8,你需要计算出不同团队队伍的总数,也就是说,如果团队中有8名队员。第二阶段的问题是如果只有两个角色,计算出阵型的数量,但你需要计算0个玩家的阵型数量,1个玩家,2个玩家......最多8个玩家。然后,当你来解决第三阶段的答案时,你可以说例如"如果我在角色CI中放置3个玩家,剩下5个玩家,剩下两个角色,我可以看看我已经计算过的答案5个玩家的双角色问题,看看角色C中有3个玩家有多少阵型。"