python递归解决0-1背包问题

2022-03-11 00:00:00 python 解决 递归

python递归解决0-1背包问题,这段代码使用了递归的方法实现,代码还有改进的地方。

"""
皮蛋编程(https://www.pidancode.com)
创建日期:2022/4/2
功能描述:python递归解决0-1背包问题
"""

# 递归实现的背包算法
# 背包大小
bag = 10
# 物品大小清单
list = [5, 9, 8, 2, 4, 1, 6, 7, 3]
# 预处理:从小到大排序
list.sort()


# 求背包组合
def getb(B, L):
    # 本次查找结果
    r = []
    # 取最小数
    for k in range(0, len(L)):
        # 去掉前面的k-1个元素,组成sL列表,在此基础上查找,以免出现重复的组合
        sL = L[k:]
        if len(sL) < 2:
            break
        # 取第一个元素(列表中的最小元素)
        x = sL[0]
        # 背包的剩余空间
        e = B - x
        # 查找e是否在表中,从sL[1]开始查找
        for i in range(1, len(sL)):
            # 找到等于e的值,存入这组结果
            if sL[i] == e:
                r.append([x, sL[i]])
                break
            elif sL[i] > e:
                break
        # 取子列表,sL[i]>=e的情况取中间的片段(减少不必要的开销),否则取从1开始的全部片段
        if sL[i] >= e:
            sL = sL[1:i]
        else:
            sL = sL[1:]
        # 继续在子列表sL[1:]中以e为背包大小求组合
        sr = getb(e, sL)
        # 查找的子结果处理后添加到结果列表中
        for j in sr:
            j.insert(0, x)
        r.extend(sr)
    # 返回本次查找结果
    return r


# 计算结果,输出结果
result = getb(bag, list)
for i in result:
    print(i)

输出结果:
[1, 9]
[1, 2, 7]
[1, 2, 3, 4]
[1, 3, 6]
[1, 4, 5]
[2, 8]
[2, 3, 5]
[3, 7]
[4, 6]

代码在python3.9下测试通过。

相关文章