本来背包问题,比较直观的解释,是用二维的转移方程,但简洁起见,很多地方以及下文的介绍都是用一维的转移方程,在二维到一维的转换中要注意,01背包和完全背包的计算顺序,01背包的dp数组是从后向前计算更新,完全背包的dp数组是从w[i]开始向后更新。
要想理解计算顺序的不同,先看一下二维的转移方程是什么样的:
01背包
d p [ i ] [ j ] dp[i][j] dp[i][j]表示前 i i i件物品恰好装入容量为 v v v的背包中所能获得的最大价值,共 n n n件物品,每件物品的重量 w [ i ] w[i] w[i],价值 c [ i ] c[i] c[i],背包容量 V V V
d p [ i ] [ v ] = m a x { d p [ i − 1 ] [ v ] , d p [ i − 1 ] [ v − w [ i ] ] + c [ i ] } dp[i][v] = max\{dp[i-1][v],dp[i-1][v-w[i]]+c[i]\} dp[i][v]=max{ dp[i−1][v],dp[i−1][v−w[i]]+c[i]}
边界
d p [ 0 ] [ v ] =