使用回溯算法结合递归树+备忘录解决01背包问题


问题描述:

对于一组不同重量、不可分割的物品,我们需要选择一些装入背包,在满足背包最大重量限制的条件上下,背包中物品总重量的最大值是多少呢?

比如对于一组物品,重量如下

(2,2,4,6,3)

画出递归树

虚线框表示预判断,放了之后超了,表示不执行了
有颜色的框表示之前的分支已经执行过了,有重复,不再执行。
相当于剪枝,大大降低了时间复杂度

相应的代码实现

max_w = -1  # 总重量
weight = [2,2,4,6,3]  # 物品重量
n = 5  # 物品个数
capacity = 9 # 背包承受的最大重量

mem = {} # 备忘录

def bag01(idx, cur_w):
    global max_w
    
    if cur_w == capacity or idx == n:
        
        if cur_w>max_w:
            max_w = cur_w
        
        return
    
    bag01(idx + 1 ,cur_w)
    if (cur_w + weight[idx]) <= capacity:
        bag01(idx + 1 ,cur_w + weight[idx])
    
bag01(0, 0)
print(max_w)

PS:虽然递归树看上去是并行执行的,但递归的过程是压栈执行的,是顺序一条分支一条分支执行的,所以可以
只用一个变量max_w保存当前的总重量,只要判断下此条分支的总重要是否比之前分支的放法更好即可


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM