⭐️01背包和多重背包的比较(最大值问题)
- 01背包的递推公式
d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i − 1 ] [ j − w e i g h t [ i ] ] + v a l u e [ i ] ) dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i]) dp[i][j]=max(dp[i−1][j],dp[i−1][j−weight[i]]+value[i])
01背包的一维数组一定是从后往前去遍历【物品只有1个,只能添加一次】
d p [ j ] = m a x ( d p [ j ] , d p [ j − w e i g h t [ i ] ] + v a l u e [ i ] ) dp[j]=max(dp[j],dp[j-weight[i]]+value[i]) dp[j]=max(dp[j],dp[j−weight[i]]+value[i])
01背包看的是上层的数据
- 多重背包的递推公式
d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − w e i g h t [ i ] ] + v a l u e [ i ] ) dp[i][j]=max(dp[i-1][j],dp[i][j-weight[i]]+value[i]) dp[i][j]=max(dp[i−1][j],dp[i][j−weight[i]]+value[i])
多重背包的一维数组是从前往后遍历,因为物品有无数个,可以反复重复地添加
d p [ j ] = m a x ( d p [ j ] , d p [ j − w e i g h t [ i ] ] + v a l u e [ i ] ) dp[j]=max(dp[j],dp[j-weight[i]]+value[i]) dp[j]=max(dp[j],dp[j−weight[i]]+value[i])
多重背包看的是当前层的数据