ACM-01背包问题-Python

日后完善

二维数组实现

if __name__ == '__main__':
    # 背包空间
    space = 10
    # 默认第一个元素为 0, 仅仅是为了方便理解
    weights = [0, 2, 2, 3, 1, 5, 2]
    values = [0, 2, 3, 1, 5, 4, 3]

    n = len(values)

    # 初始化全为0, 但输出结果仅第一行和第一列均为 0
    maxitr = [[0 for _ in range(space + 1)] for _ in range(n)]

    for i in range(1, n):
        # 当前物品的重量和价值
        weight = weights[i]
        value = values[i]
        for j in range(1, space + 1):  # 第0个默认为 0
            # 上一次的最大价值
            last_max_value = maxitr[i - 1][j]

            # 如果还可以装下
            if j >= weight:
                """
                这是为了j - weight >= 0, 不出现索引错误
                真正的判断是 maxitr[][j - weight]: 得到的是刚好满足当前重量的背包容量的最大价值
                """
                maxitr[i][j] = max(last_max_value, maxitr[i - 1][j - weight] + value)
            else:
                maxitr[i][j] = last_max_value

    for data in maxitr:
        print(data)

运行结果:

使用一维数组实现

if __name__ == '__main__':
    space = 10
    # 直接第一个元素为 0
    weights = [0, 2, 2, 3, 1, 5, 2]
    values = [0, 2, 3, 1, 5, 4, 3]

    n = len(values)

    maxitr = [0 for _ in range(space + 1)]

    for i in range(1, n):
        # 当前物品的重量和价值
        weight = weights[i]
        value = values[i]
        for j in range(space, 0, -1):
            # 上一次的最大价值
            last_max_value = maxitr[j - 1]

            # 如果还可以装下
            if j >= weight:
                """
                这是为了j - weight >= 0, 不出现索引错误
                真正的判断是 maxitr[j - weight]: 得到的是刚好满足当前重量的背包容量的最大价值
                """
                maxitr[j] = max(last_max_value, maxitr[j - weight] + value)

        print(i, maxitr)

运行结果:

Github: 01背包 01背包改进

posted @ 2020-10-15 16:06  漫漫长夜何时休  阅读(106)  评论(0编辑  收藏  举报