动态规划解决背包问题的python小练习

这里就不讲具体的思路了,个人觉得这个博客讲的很清楚了:https://blog.csdn.net/w113691/article/details/81743201

在解决问题的时候,我搞不清楚为什么有的地方要加1,所以自己试着按自己的理解重新写了一下,运行成功!

1.定义一个bag函数,记录初始value列表,记录在依次放入物品的时候,在不同的重量限制下的总价值。这里之所以是c+1是因为从0到10的重量有0,1,2,3,4,5,6,7,8,9,10一共11个数字,所以要留出11个位置。n是因为把物品记为0,1,2,3,4,5共6个数字,只需要6个位置。这样就生成了一个6*11的所有值都为0的列表(我不知道这样表达准不准确……)。然后从第0个物品开始,令容量为1(0就不考虑了),看是否应该放入这个物品,然后考虑容量2,3……10,再考虑第1个物品,同样看是否放入。最后返回value值。

def bag(n,c,w,v):
    value =[[0 for j in range(c+1)]for i in range(n)]#背包的重量从0到c,物品从0到n-1
    print(value)
    for i in range(0,n):#i表示第i个物品,我们把第1个物品看作第0个
        for j in range(1,c+1):#j表示重量为j,从重量为1开始算
            if j < w[i] :#背包容量不够,放不下第i个物品
                value[i][j] = value[i-1][j]#value表示总价值,不放这个物品,肯定就保留前一个物品的总价值
            elif j >= w[i] :
                if value[i][j] < value[i-1][j-w[i]]+v[i]:#背包容量足够,价值提升
                    value[i][j] = value[i-1][j-w[i]]+v[i]
                else: value[i][j] = value[i-1][j]#背包容量足够,但是价值没有提升
    for x in value:
        print(x)
    return value

2.回溯,看是否选择了第i个物品。如放入了就把该处的False改成True。注意这里我在输出第几个物品的时候用的是i+1,这也是为了理解方便,免得输出第0个物品不知道是哪一个……

def show(n,c,w,value):
    print('max value',value[n-1][c])
    x = [False for i in range(n)]
    j = c
    for i in range(n-1,0,-1):
        if value[i][j] > value[i-1][j]:#i代表第i个物品,如果放入第i个物品的价值大于同等重量放入i-1物品的重量,说明选择了物品i
            x[i]=True
            j -= w[i]
    print('items:')
    for i in range(n):
        if x[i]:
            print('no.',i+1,'  ')

3.输入数据,产生结果。

if __name__ =='__main__':
    n = 6
    c = 10
    w = [2, 2, 3, 1, 5, 2]
    v = [2, 3, 1, 5, 4, 3]
    value = bag(n,c,w,v)
    show(n,c,w,value)

4.结果展示

[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
[0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2]
[0, 0, 3, 3, 5, 5, 5, 5, 5, 5, 5]
[0, 0, 3, 1, 1, 4, 4, 6, 6, 6, 6]
[0, 5, 5, 8, 6, 6, 9, 9, 11, 11, 11]
[0, 5, 5, 8, 6, 4, 9, 9, 12, 10, 10]
[0, 5, 3, 8, 8, 11, 9, 7, 12, 12, 15]
max value 15
items:
no. 2   
no. 4   
no. 5   
no. 6   

Process finished with exit code 0

 参考文献:https://blog.csdn.net/w113691/article/details/81743201

https://blog.csdn.net/qq_34178562/article/details/79959380

https://blog.csdn.net/littlethunder/article/details/26575417

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值