一、Leetcode 1049. 最后一块石头的重量 II
这几个题都很不好给转成01问题。本题一开始我以为怎么撞都行,其实不是,相当于给每项前面加±1,
就是说有时候不能浪费小石头,得跟大石头碰。
那么问题就很明显了,类似于分割等和子集。变成01背包问题。然后背包容量是sum的一半。
dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);
dp初始化大小题目给了,默认0;
二、Leetcode 494. 目标和
如何转化为01背包问题呢。假设加法的总和为x,那么减法对应的总和就是sum - x。
所以我们要求的是 x - (sum - x) = target, x = (target + sum) / 2.
此时问题就转化为,装满容量为x背包,有几种方法。
组合问题递推公式 dp[j] += dp[j - nums[i]]
初始化 dp[0] 为 1。
三、Leetcode 474.一和零
确定dp数组(dp table)以及下标的含义
dp[i][j]:最多有i个0和j个1的strs的最大子集的大小为dp[i][j]。
dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);