动态规划 0-1 背包问题 python

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shaoyou223/article/details/82881127
#有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)



猜你喜欢

转载自blog.csdn.net/shaoyou223/article/details/82881127