01背包问题 二维
- 不放物品i:由dp[i - 1][j]推出,即背包容量为j,里面不放物品i的最大价值,此时dp[i][j]就是dp[i - 1][j]。(其实就是当物品i的重量大于背包j的重量时,物品i无法放进背包中,所以背包内的价值依然和前面相同。)
- 放物品i:由dp[i - 1][j - weight[i]]推出,dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]的时候不放物品i的最大价值,那么dp[i - 1][j - weight[i]] + value[i] (物品i的价值),就是背包放物品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]);
==>
dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
所以遍历得是倒序
416. 分割等和子集
背包 ==> 怎么样在w体积的背包装下最多value的石头
分割等和子集 ==> 怎么样在sum/2体积的背包下装满==>装最多value=本身的数字