【问题标题】:Adding category constraints to knapsack algorithm将类别约束添加到背包算法
【发布时间】:2015-12-21 21:16:28
【问题描述】:
我正在尝试实现背包算法来玩梦幻篮球。我编写了一个传统的 0/1 背包求解器,它为每个球员输入成对的值和权重(价格),并输出总工资低于工资帽的球员最有价值的组合。
然而,幻想比赛强制你必须根据球员的位置来组成你的 8 人阵容——即你的阵容必须由 1 名控球后卫、1 名得分后卫、1 名小前锋、1 名大前锋、1 名中锋,1名得分后卫或控球后卫,1名小前锋或大前锋,以及1名任意位置的球员。
我正在寻找有关如何扩展传统动态编程背包算法以包含这些约束的建议。
【问题讨论】:
标签:
algorithm
dynamic-programming
knapsack-problem
【解决方案1】:
向您的数组添加另一个维度,标记您已填充的阵容中的哪个位置。
【解决方案2】:
正如索林所说,你的 DP 中需要另一个状态来持续跟踪填充的位置。
为 DP 的第三种状态使用位掩码,其中 ith 位指示 ith 角色是否已被占用。例如,255 = (11111111),表示每一个可能的角色都会被扮演。
这是可行的,因为角色的数量只有八个。另外,每个角色只需要一名球员。因此,第三种状态需要一个相对较小的数组(2^8 = 256)。从理论上讲,您可以使用更大的碱基而不是使用二进制碱基。通常,您的第三种状态需要 b^r 大小的数组,其中 b = 每个角色的玩家 + 1 和 r = 角色,但内存使用量可能很大。