当前位置:   article > 正文

动态规划解0-1背包问题(无价值属性),附Python代码_无价值背包问题py代码

无价值背包问题py代码

本文解决的问题是【不含有价值属性的】0-1背包问题。具体如下:

现有一个背包体积为V,若干个物品体积为vi。现要求用这些物品把背包装的尽可能满,请问背包最多能装多少体积的物品?(忽略价值属性,只考虑体积)

 

解题思路是采用动态规划的方式,如下表:

 1234567
20222222
30233555
50233557
8..............

上图假设物品的体积分别为2,3,5,8,背包体积为7。

 

我们来分析一下动态规划数组代表的含义:第一行代表【只在背包里放第一个物品】,第二行代表【只在背包里放前两个物品】,第n行代表【只在背包里放前n个物品】;第一列代表【背包体积为1时能装的最大体积】,第n列代表【背包体积为n时能装的最大体积】。那么,DP[i][j]的含义就是:在只取前i个物品时,背包容量为j的情况下能装的最大体积。显然,当背包体积为k,物品数量为n时,DP[n][k]即为所求。其时间复杂度为k*n,就一般的无价值背包问题来说这个时间复杂度是完全可以接受的。

 

动态规划的核心(状态转移函数):在该问题中,状态转移函数为:

DP[i][j] = max(DP[i-1][j-vi]+vi,DP[i-1][j]),其中vi为第i个物品的体积。

(理解:如果背包装上第i个物品那么装载最大的情况就是当前体积减去vi时装载最大的情况再加上vi;否则就按照前i-1个物体的结果作为当前装载最大的结果。两者中更大的那个就是当前的最大结果。)

这里我们定义DP[ ][x] = -infinity if x < 0 (因为背包体积为负是不合理的,定义为负无穷防止此类情况影响计算)

到此为止无价值属性的0-1背包问题基本解决。附Python代码如下:

 

  1. # 0-1 bag problem (without value) solution
  2. # use dynamic program method
  3. import random
  4. def DP_01_bag(numlist,target):
  5. # numlist: int num list
  6. # target: int num
  7. DP = [[0 for i in range(target+1)] for i in range(len(numlist))] # initialize
  8. for i in range(len(numlist)):
  9. for j in range(target+1):
  10. if i == 0:
  11. if j >= numlist[i]:
  12. DP[i][j]=numlist[i]
  13. else:
  14. if j<numlist[i]:
  15. DP[i][j] = DP[i-1][j]
  16. else:
  17. DP[i][j] = max(DP[i-1][j-numlist[i]]+numlist[i],DP[i-1][j])
  18. return DP[len(numlist)-1][target]
  19. if __name__ == "__main__":
  20. numlist = random.sample(list(range(200)),8)
  21. target = random.choice(list(range(100,300)))
  22. result = DP_01_bag(numlist,target)
  23. print("numlist is :", numlist)
  24. print("target is :", target)
  25. print("result is:", result)

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/332873?site
推荐阅读
相关标签
  

闽ICP备14008679号