文章目录
在简单复习完数据结构以后,便开始了算法复习。本博客将结合复习视频与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[i−1][j],max{ dp[i−1][j],dp[i−1][j−v[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[i−1][j],max{ dp[i−1][j],dp[i−1][j−v[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[i−1][j],max{
dp[i−1][j],dp[i][j−v[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 ]