Python,01背包、动态规划x

来源:校园招聘 发布时间:2020-08-28 点击:

 Python 0/1 背包、动态规划 参考:http://www.cnblogs.com/fcyworld/p/6243012.html Python 0/1 背包、动态规划 0/1 背包问题:在能承受一定重量的背包中,放入重量不同,价值不同的几件物品,怎样放能让背包中物品的价值最大? 比如,有三件物品重量 w,价值 v 分别是 w=[5,3,2] v=[9,7,8] 包的容量是 5,也就是我们要求得 maxVal=v1+v2+v3…… 约束条件为:ws=w1+w2+w3…… 我们的思路是,列举出所有可能的放入背包的选项,然后比较哪个价值大,这需要用到决策树。

 决策树的思想是,用一组向量来描述当前的状态,比如 [当前考虑的物品 i, 当前背包的空间 w, 当前已获得的价值 v], 决策树左儿子表示不选取当前物品 np,右儿子表示选取当前物品 p,首先递归到索引为最后一个的物品,然后回溯,每回溯到一个物品时候就比较选取当前物品和不选取当前物品哪个更有价值

  1 def maxVal(w, v, i, ws):

  2

  if i == 0:

  3

  if w[i] <= ws:

  4

  return v[i]

  5

  else:

  6

  return 0

  7

  without_i = maxVal(w, v, i-1, ws)#用递归算出不选取当前物品时候价值

  8

  if w[i] > ws:

  9

  return without_i

 10

  else:

 11

  with_i = maxVal(w, v, i-1, ws-w[i]) + v[i]#算出选取当前物品时候的价值

 12

  return max(without_i, with_i)

 13

 14

 15 w = [5, 3, 2]

 16 v = [9, 7, 8]

 17 val = maxVal(w, v, 2, 5)

 18 print(val)

  这个方法可以正确运行,但是为 O(2^n),所以当数据量增大时候,耗时会急剧增大,有什么办法可以减小耗时?同时列举出所有可能得出结论? 这就用到动态规划了 拿上面这个例子来说 当我们考虑第二个也就是最后一个物品的时候,我们需要把第 0 个,第 1 个物品要不要选取考虑一次 当我们考虑第一个儿子时候,也要把第零个物品要不要选取考虑一次

 。。。

 当物品非常多的时候,就造成了非常大的浪费 那么,我们能不能每次考虑一个物品之后,就把每种情况下的特征和值记录下来,以供以后考虑别的物品时候使用? 这就是动态规划 在这个背包问题中,我们可以使用(i,ws)来描述决策树中每种情况,同时保存对应的值。

 memo={}

 def maxVal(w, v, i, ws):

 # i 是序号,ws 是容量,w 是空间 v 是价值

 #i 需要从 w 长度减一开始,就是从大往小遍历,否则有问题

 try:

 return memo[(i,ws)]

 except KeyError:

 if i == 0:

 if w[i] <= ws:

 memo[(i, ws)] = v[i]

 return v[i]

 else:

 memo[(i, ws)] = 0

 return 0

 without_i = maxVal(w, v, i-1, ws)

 if w[i] > ws:

 memo[(i, ws)] = without_i

 return without_i

 else:

 with_i = maxVal(w, v, i-1, ws-w[i]) + v[i]

 res = max(without_i, with_i)

 memo[(i, ws)] = res

 return res

 w = [5, 3, 2]

 v = [9, 7, 8]

 val = maxVal(w, v, 2, 5)

 print(val)

推荐访问:背包 规划 动态
上一篇:会计论文对于会计信息真实性思考
下一篇:2020对于科技活动周活动总结

Copyright @ 2013 - 2018 优秀啊教育网 All Rights Reserved

优秀啊教育网 版权所有