动态规划 0-1 背包问题 python
#有n 个物品,它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?#number=4,capacity=8在程序中用n表示物品数量,用j表示剩余容量w = [0,2,3,4,5]#表示重量v = [0,3,4,5,6]#表示价值#列出模型递推式# 1)当当前剩余容量小于物品重量时,即 j<w(i),此时不选择该物品,价值不增加,和之前的价...
·
#有n 个物品,它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和? #number=4,capacity=8 在程序中用n表示物品数量,用j表示剩余容量 w = [0,2,3,4,5]#表示重量 v = [0,3,4,5,6]#表示价值 #列出模型递推式 # 1)当当前剩余容量小于物品重量时,即 j<w(i),此时不选择该物品,价值不增加,和之前的价值一样。V(i,j)=V(i-1,j) # 2)当当前剩余容量大于物品重量时,即 j>=w(i),此时鳔胶加与不加之间的价值大小,取最大值 V(i,j)=max{V(i-1,j),V(i-1,j-w(i))+v(i)} #先建表 n= 4 c= 8 import numpy as np x = np.zeros([n+1,c+1]) for i in range(1,n+1): for j in range(c,0,-1): if j<w[i]: x[i,j] = x[i-1,j] else: x[i,j] = max(x[i-1,j],x[i-1,j-w[i]]+v[i])#前i-1个物品的最优解与第i个物品的价值之和更大 print(x) #最大的结果为10 #最优解即是x(number,capacity)=x(4,8)=10 #下面如何回溯得到路径 item = [0]*(n+1) def find_which_item(i,j,item): if i >=0: if x[i,j] == x[i-1,j]:#表示没选这个 item = find_which_item(i-1,j,item) elif j-w[i]>=0 and x[i,j] == x[i-1,j-w[i]]+v[i]: item[i] = 1 item = find_which_item(i-1,j-w[i],item) return item #这里的4 8 代表的是x(4,8)这里的数字 item = find_which_item(4,8,item) print(item)
更多推荐
所有评论(0)