动态规划 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),此时不选择该物品,价值不增加,和之前的价值一样。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)



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值