将类别约束添加到背包算法

时间:2015-12-21 21:16:28

标签: algorithm dynamic-programming knapsack-problem

我正在尝试实施背包算法来玩幻想篮球。我写了一个传统的0/1背包解算器,它为每个玩家提供成对的价值和权重(价格),并输出组合工资低于工资帽的最有价值的玩家组合。

然而,幻想比赛强制你必须根据球员的位置来组成你的8个球员阵容 - 即你的阵容必须包括1个控球后卫,1个得分后卫,1个小前锋,1个大前锋,1个中锋,1名得分后卫或控球后卫,1名小前锋或大前锋,以及1名任何位置的球员。

我正在寻找有关如何扩展传统动态编程背包算法以包含这些约束的建议。

2 个答案:

答案 0 :(得分:0)

为您的数组添加另一个维度,标记您已填充的阵容中的哪个位置。

答案 1 :(得分:0)

正如索林所说,你需要在你的DP中另一个状态来跟踪填补的位置。

对DP的第三个状态使用位掩码,其中 ith 位指示是否已采用 ith 角色。例如,255 =(11111111),这意味着将采取每个可能的角色。

这是可行的,因为角色的数量只有八个。另外,每个角色只需要一名玩家。因此,第三状态需要相对较小的阵列(2 ^ 8 = 256)。从理论上讲,您可以使用更大的碱基,而不是使用二进制碱基。通常,您的第三个州需要 b ^ r 大小的数组,其中 b =每个角色的玩家+ 1 r =角色,但是内存使用量可能很大。