算法分析与设计(一)——0-1背包问题

在简单复习完数据结构以后,便开始了算法复习。本博客将结合复习视频与LeetCode题目,面向机考算法复习。背包动态规划问题一般分为三种题型:

  • 最值问题:给定可选物品和限定容量,求最大价值或者最大体积。
    ①0-1背包问题
    ②完全背包问题。
  • 恰好取到背包容量问题
    ①0-1背包问题 + 恰好取到背包容量。
  • 组合问题
    ①考虑顺序得组合问题。
    ②0-1背包组合问题。

1 三种背包问题详解

三种背包问题都建立在0-1背包问题得基础之上的,因此下面我将从0-1背包开始,介绍三种问题的求解方式。
(1)0-1背包问题

  • 最大价值
    d p [ i ] [ j ] = { d p [ i − 1 ] [ j ] , 不 能 放 入 max ⁡ { d p [ i − 1 ] [ j ] , d p [ i − 1 ] [ j − v [ i ] ] + p [ i ] , 可 以 装 入 } dp[i][j]=\begin{cases} dp[i-1][j],& 不能放入\\ \max \{dp[i-1][j],dp[i-1][j-v[i]]+p[i], &可以装入\} \end{cases} dp[i][j]={ dp[i1][j],max{ dp[i1][j],dp[i1][jv[i]]+p[i],}
  • 最大体积
    d p [ i ] [ j ] = { d p [ i − 1 ] [ j ] , 不 能 放 入 max ⁡ { d p [ i − 1 ] [ j ] , d p [ i − 1 ] [ j − v [ i ] ] + v [ i ] , 可 以 装 入 } dp[i][j]=\begin{cases} dp[i-1][j],& 不能放入\\ \max \{dp[i-1][j],dp[i-1][j-v[i]]+v[i], &可以装入\} \end{cases} dp[i][j]={ dp[i1][j],max{ dp[i1][j],dp[i1][jv[i]]+v[i],}

其中,最大价值和最大体积的区别就是在可以装入时,dp[i][j]加上的是价值还是体积。

(2)完全背包问题
完全背包问题中每个物品可以被无限次的选用,因此相对于0-1背包问题,它的递推方程仅有一处不同:
d p [ i ] [ j ] = { d p [ i − 1 ] [ j ] , 不 能 放 入 max ⁡ { d p [ i − 1 ] [ j ] , d p [ i ] [ j − v [ i ] ] + p [ i ] , 可 以 装 入 } dp[i][j]=\begin{cases} dp[i-1][j],& 不能放入\\ \max \{dp[i-1][j],dp[i][j-v[i]]+p[i], &可以装入\} \end{cases} dp[i][j]={ dp[i1][j],max{ dp[i1][j],dp[i][jv[i]]+p[i],}

即在考虑装入物品i后,还要从物品i开始考虑而不是从物品i-1开始选择。

(3)恰好背包问题
恰好背包问题就是“0-1背包问题+最大体积+判断能否恰好装下”。

(4)组合问题
组合问题是一个物品只能选择一次,输出获得最大价值时物品的选择可能情况。对于物品i在容量为j时的可选择情况是由不装入物品i时的可能情况+装入物品i时的可能情况组成。因此递推方程为:
d p [ i ] [ j ] = { d p [ i − 1 ] [ j ] , 不 能 放 入 max ⁡ { d p [ i − 1 ]

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

冠long馨

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值