头歌03- 01背包

本文探讨了经典的01背包问题,其中包含n个物品,每个物品有特定的重量w_i和价值v_i,目标是找到能放入容量为V的背包中的物品组合,以使总价值最大化。通过输入样例展示了问题的输入格式和输出结果,即能携带物品的最大价值为28。
摘要由CSDN通过智能技术生成

"""

题目:有n个重量分别为w={w_1,w_2,…,w_n}的物品,他们的价值分别为v={v_1,v_2,…,v_n},给定一个容量为V的背包。

设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中,要求选中的物品不仅能够放到背包中,并且背包内物品的总价值达到最大。

输入格式

第一行输入两个整数n、G,其中n表示物品的数量,G表示背包的容量体积。

第二行输入n个整数,整数间以空格分隔,表示n个物品的重量w_i

第三行输入n个整数,整数间以空格分隔,表示n个物品的价值v_i

输出格式

一个实数,表示能携带物品的最大价值。

输入样例

5 13

3 4 4 5 10

2 9 9 10 24

输出样例

28

"""


def knapsack(n, G, weights, values):
    dp = [0 for _ in range(G + 1)]
    for i in range(n):
        for j in range(G, weights[i] - 1, -1):
            dp[j] = max(dp[j], dp[j - weights[i]] + values[i])
    return dp[G]

# 输入
n, G = map(int, input().split())
weights = list(map(int, input().split()))
values = list(map(int, input().split()))

# 计算并输出最大价值
print(knapsack(n, G, weights, values))

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学不好python的小猫

感谢您的支持,我会长期更新我的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值