写在前面
“背包问题”是一个非常经典的问题.
状态定义
dp[i][j]:表示当使用goods[0, …, i],最多可装j重量物品时,此时背包最多能装物品的价值
(这里我们使用的是二维dp方法,因为二维入门理解较为容易,一维的可以通过简单的修改就得到。)
状态转移方程
0/1背包
定义:物品只能用一次
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][j-weight[i]] + value[i])
注意这两种问题的区别仅仅是dp[ ][j-weight[i]] + value[i]( = i-1/i)不同