01背包问题

文章讲解了如何使用knapsack函数解决0-1背包问题,涉及动态规划方法和背包容量、物品体积与价值之间的优化决策。
摘要由CSDN通过智能技术生成

有 N件物品和一个容量是 V的背包。每件物品只能使用一次。

第 i 件物品的体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。

输入格式

第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。

接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i件物品的体积和价值。

输出格式

输出一个整数,表示最大价值。

代码:

def knapsack(N, V, volumes, values):
    dp = [0] * (V + 1)

    for i in range(N):
        for j in range(V, volumes[i] - 1, -1):
            dp[j] = max(dp[j], dp[j - volumes[i]] + values[i])

    return dp[V]

# 读取输入
N, V = map(int, input().split())
volumes, values = [], []
for _ in range(N):
    v, w = map(int, input().split())
    volumes.append(v)
    values.append(w)

# 输出结果
result = knapsack(N, V, volumes, values)
print(result)
 

  1. knapsack 函数:

    • knapsack 函数采用四个参数:N 表示物品数量,V 表示背包容量,volumes 表示每个物品的体积数组,values 表示每个物品的价值数组。
    • 函数使用一维数组 dp 来保存在不同背包容量下的最大总价值。
  2. 动态规划主循环:

    • 通过两个嵌套循环遍历所有物品和所有可能的背包容量。
    • for i in range(N): 遍历每个物品。
    • for j in range(V, volumes[i] - 1, -1): 从背包容量 V 到当前物品的体积 volumes[i],逆向遍历,更新 dp[j]
  3. 状态转移方程:

    • dp[j] = max(dp[j], dp[j - volumes[i]] + values[i]),表示在当前容量 j 下,选择放入物品 i 或不放入,选择最大价值。
  4. 返回结果:

    • 最终结果保存在 dp[V] 中,表示背包容量为 V 时的最大总价值。
  5. 读取输入:

    • 从输入中读取物品数量 N 和背包容量 V
    • 循环读取每个物品的体积和价值,将它们分别保存在 volumesvalues 数组中。
  6. 输出结果:

    • 调用 knapsack 函数计算最大价值,并将结果输出。

示例输入:

3 5
2 3
1 2
3 4

示例输出:

7
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值