0-1背包问题(求最大值及构造方案)python

 

题目描述

给定n种物品和一个背包,物品i的重量是Wi,其价值为Vi,背包的容量为C。如何选择装入背包的物品,可以使得装入背包中物品的总价值最大?

输入

每组输入包括三行,
第一行包括物品个数n,以及背包容量C。
第二、三行包括两个一维数组,分别为每一种物品的价值和重量。

输出

输出包括两行,第一行为背包的最大总价值,第二行为所选取的物品。
例如:最大总价值=15,物品选取策略为11001。数据保证答案唯一。

样例输入 Copy
5 10
6 3 5 4 6
2 2 6 5 4
样例输出 Copy
15
11001
while True:
    try:
        n, c = list(map(int, input().split()))
        v = list(map(int, input().split()))
        w = list(map(int, input().split()))
        dp = [[0 for i in range(c + 1)] for i in range(n + 1)]
        select = [[0 for i in range(c + 1)] for i in range(n + 1)]  # 记录选择策略
        w.insert(0, 0)
        v.insert(0, 0)
        for i in range(1, n + 1):
            for j in range(1, c + 1):
                if w[i] <= j:
                    if dp[i - 1][j] < dp[i - 1][j - w[i]] + v[i]:
                        dp[i][j] = dp[i - 1][j - w[i]] + v[i]
                        select[i][j] = 1  # 记录选择物品 i
                    else:
                        dp[i][j] = dp[i - 1][j]
                else:
                    dp[i][j] = dp[i - 1][j]

        print(dp[n][c])

        # 根据选择策略反向推导出所选择的物品
        items_selected = ""
        j = c
        for i in range(n, 0, -1):
            if select[i][j] == 1:
                items_selected = "1" + items_selected
                j -= w[i]
            else:
                items_selected = "0" + items_selected
        print(items_selected)
    except EOFError:
        break


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值