背包问题详解

本文介绍了背包问题的基本概念,包括物品价值与成本、状态转移方程的建立,并通过一个实例演示如何用动态规划求解。重点在于分析如何通过状态假设和转换条件来设计算法,适合面试前复习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0.总结

  • 趁过两天又要面试,这里简要的总结一下背包问题。
  • 博客来源: LawsonAbs@CSDN

1.题目

有N件物品和一个容量为V的背包。第i件物品的成本是 c[i],价值是 w[i]。求解将哪些物品装入背包可使价值总和最大,要求是:物品只能放一次。

2.分析

写动态规划题,需要抓住两点:做好状态假设;并推导出转换条件;

假设dp[i][j] 表示放当前第i件物品,在总质量为j的情况下,可以得到的最大价值,当前物品只有放与不放两种选择,如果选择放,那么就相当于从j个质量中腾出w[i]个质量给第i个物品;如果选择不放,那么就相当于直接“继承”第i-1件物品的最大值。
所以根据上面这两点,我们可以得到如下表达式:
dp[i][j]={dp[i−1][j]if(j<w[i])dp[i−1][j−w[i]]+c[i]if(j≥w[i]) dp[i][j]=\left\{\begin{aligned} &dp[i-1][j] \quad \quad if(j < w[i])\\ &dp[i-1][j-w[i]]+c[i] \quad if(j \ge w[i]) \end{aligned} \right. dp[i][j]={dp[i1][j]if(j<w[i])dp[i1][jw[i]]+c[i]if(jw[i])
根据这个式子,就可以写出整个代码了。

3.示例

各个物品的重量 w = [1,3,2,5] ,各个物品的金钱 p = [200,240,140,150] ,背包所能承受的最大重量 5。那么所能得到的最大价值是什么?

4.代码

def pack_01(w,c,maxW):
    # f = [0 for i in range(4) for j in range(5)]  # 生成的是一位数组
    # 第一个是行,第二个是列
    f = [[0 for _ in range(6)] for _ in range (5)]

    for i in range(1,5): # i表示当前物品 [1,5)
        for j in range(1,maxW+1): # j表示当前重量 [5,0)
            f[i][j] = f[i-1][j] # 首先初始化赋值,这是最基本的
            if j >= w[i]:
                f[i][j] = max(f[i][j],f[i-1][j-w[i]] + c[i]) # 取最大            
    print(f[4][maxW])

# 为了方便,0下标被置为0
w = [0,1,3,2,5] 
c = [0,100,240,140,150]
maxW = 5 # 能承受的最大重量
pack_01(w,c,5)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

说文科技

看书人不妨赏个酒钱?

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

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

打赏作者

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

抵扣说明:

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

余额充值