当前位置: 代码迷 >> python >> 背包算法动态编程(错误输出)这是我到目前为止所拥有的
  详细解决方案

背包算法动态编程(错误输出)这是我到目前为止所拥有的

热度:85   发布时间:2023-07-16 10:04:29.0

我为背包问题的动态编程实现编写了这段代码。

#B = maximum weight
#n = number of items
#p = list of weights
#a = list of values

#p[i] = weight with value a[i]



   def maximum_attractiveness(n, B, p, a):
     f = [i for i in range(n+1)]
     m = [f for i in range(B+1)]
     m[0] = [0 for i in range(len(m[0]))]
     for i in m:
      i[0] = 0
     print(m)
     for j in range(n):
      for w in range(B):
       if (p[j]) > (w):
        m[w][j] = m[w][j-1]
       else:
        m[w][j] = max(m[w][j-1],m[w-p[j]][j-1]+a[j])
    return m[B][n]

我得到的算法输出不正确。 我哪里做错了?

f = [i for i in range(n+1)]
m = [f for i in range(B+1)]

这对每个位置m使用相同的数组f ,因此例如如果你改变m[1][k] ,你也改变每个i m[i][k] 你可能想做

m = [[i for i in range(n+1)] for i in range(B+1)]

我认为可能还有一些其他的错误,所以也许你应该在某些点打印出中间数组,以检查结果不是你期望它们的位置。

更新:

  • 你的初始化对我来说很奇怪。 我认为它应该只是m = [[0]*n for i in range(B+1)]因为你需要一个零矩阵。
  • 它应该是for w in range(B+1)
  • 你不应该返回m[B][n] ,而是max(m[j][n] for j in range(B+1))

我的尝试,它完全避免了矩阵,只使用一个数组:

m = [0]*(B+1)
for j in range(n):
    for w in range(B,p[j]-1,-1):
        m[w] = max(m[w], m[w-p[j]] + a[j])
return max(m)