繁体   English   中英

背包约束python

[英]Knapsack constraint python

假设我有一个代表篮球运动员的元组列表,以及他们的姓名,位置,费用和预计得分,

listOfPlayers = [
                 ("Player1","PG",Cost,projectedPoints),
                 ("Player2","PG",Cost,projectedPoints),
                 ("Player3","SG",Cost,projectedPoints),
                 ("Player4","SG",Cost,projectedPoints),
                 ("Player5","SF",Cost,projectedPoints),
                 ("Player6","SF",Cost,projectedPoints),
                 ("Player7","PF",Cost,projectedPoints),
                 ("Player8","PF",Cost,projectedPoints),
                 ("Player9","C",Cost,projectedPoints),
                 ("Player10","C",Cost,projectedPoints) 
                ]

假设所有名称,成本和预计点都是可变的。

我有一个传统的背包问题,他们可以根据给定的重量对背包进行分类和包装。 但是,这并不说明职位。
我想知道是否有一种方法可以编辑背包代码,使其仅包含每个位置之一,即(pg,sg,sf,pf,c)。

传统的0/1背包可以做到这一点,还是我需要切换到其他东西?

这称为“多项选择背包问题”。

您可以使用类似于动态编程解决方案的算法来解决0/1背包问题。

0/1背包问题的解决方案如下:(来自Wikipedia

m[i, w]定义为重量小于或等于w使用i项可获得的最大值。
我们可以递归定义m[i, w]如下:

 m[i, w] = m[i-1, w] if w_i > w (new item is more than current weight limit) m[i, w] = max(m[i-1, w], m[i-1, w-w_i] + v_i) if w_i <= w. 

然后可以通过计算m[n,W]找到解决方案。 为了有效地做到这一点,我们可以使用一个表来存储以前的计算。

现在,扩展名只是查找所有选择中的最大值。

对于n位置i可供选择的玩家( c_i_j是选择j的成本, p_i_j是积分),我们将有:

m[i, c] = max(m[i-1, c],
              m[i-1, c-c_i_1] + p_i_1   if c_i_1 <= c, otherwise 0,
              m[i-1, c-c_i_2] + p_i_2   if c_i_2 <= c, otherwise 0,
              ...
              m[i-1, c-c_i_n] + p_i_n   if c_i_n <= c, otherwise 0)

所以,说我们有:

Name     Position  Cost  Points
Player1  PG        15    5
Player2  PG        20    10
Player3  SG        9     7
Player4  SG        8     6

然后,我们将有2个职位“ PG”和“ SG”,每个职位将有2个选择。

因此,对于位置“ PG”(在i=1 ),我们将有:

m[i, c] = max(m[i-1, c],
              m[i-1, c-15] + 5    if 15 <= c, otherwise 0,
              m[i-1, c-20] + 10   if 20 <= c, otherwise 0)

对于位置“ SG”(在i=2 ),我们将有:

m[i, c] = max(m[i-1, c],
              m[i-1, c-9] + 7    if 9 <= c, otherwise 0,
              m[i-1, c-8] + 6    if 8 <= c, otherwise 0)

首先,达克林的出色回答。 我没有发表评论的特权,所以我正在写答案。 这实际上是一个“多选择背包问题”。 我实现了其中一种问题,并在Online Judge中成功运行了该问题。 杜克林算法的唯一问题是,它不会考虑先前项目集中的至少一项。 因此,从上面:

m[i, c] = max(m[i-1, c],
              m[i-1, c-15] + 5    if 15 <= c, otherwise 0,
              m[i-1, c-20] + 10   if 20 <= c, otherwise 0)`

这最多只适用于一种。 如果您为零添加一点校验,那么对于i=1 (“ PG”)而言,它恰好适合每种类型的一项:

m[i, c] = max(m[i-1, c],
          m[i-1, c-15] + 5    if 15 <= c and  m[i-1, c-15] != 0, otherwise 0,
          m[i-1, c-20] + 10   if 20 <= c and  m[i-1, c-20] != 0, otherwise 0)

对于i=2 (“ SG”):

m[i, c] = max(m[i-1, c],
          m[i-1, c-9] + 7    if 9 <= c and m[i-1, c-9] != 0, otherwise 0,
          m[i-1, c-8] + 6    if 8 <= c and m[i-1, c-8] != 0, otherwise 0)

等等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM