Day36 | Part5
约 357 个字 22 行代码 预计阅读时间 1 分钟
1049.最后一块石头的重量II
尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,化解成01背包问题
物品的重量为stones[i]
,物品的价值也为stones[i]
- dp[j]表示重量为j的背包,最多可以背最大重量为dp[j]
- 递推公式:
dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);
- 最大容量为:
30 * 100 / 2
, 初始均为0 - 物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒序遍历
- 举例: [2,4,1,1] → 如图
1 2 3 4 5 6 7 8 9 10 |
|
dp[target]
,另一堆就是sum - dp[target]
, 因target = sum / 2 因为是向下取整,所以sum - dp[target] >= dp[target]
494.目标和
假设加法的总和为x,那么减法对应的总和就是sum - x。要求的是 x - (sum - x) = target, 则x = (target + sum) / 2, 此时转为 装满容量为x的背包,有几种方法, x即背包容量
- dp[j]:填满j(包括j)这么大容积的包,有dp[j]种方法
- 公式:
dp[j] += dp[j - nums[i]]
→ 举例参考 - 初始化为1
- nums放在外循环,target在内循环,且内循环倒序
- 举例nums:[1, 1, 1, 1, 1], target: 3, 如图
1 2 3 4 5 6 7 8 9 10 11 12 |
|
474.一和零
TODO: DP难度有点大,先暂停...后面针对性补