这道题目还没有太搞明白
现在明白了!!背下来就是最好的方法,对于我这个砂纸!!
背下来吧
求装满背包的方法 dp[j] += dp[j - nums[i]]
。
注意遍历背包和遍历物品的顺序。
有下面两种:
排列问题:先背包再物品,注意内层循环判断背包大于物品
组合问题:先物品再背包,注意遍历背包要是否要倒序就涉及到是01背包还是完全背包。
本题是组合问题且是**01背包(倒叙背包)**。
Problem: 494. 目标和
Reference
https://www.programmercarl.com/0494.%E7%9B%AE%E6%A0%87%E5%92%8C.html#%E6%80%9D%E8%B7%AF
思路
这是这道题目最为巧妙地地方:如何转化为01背包问题。
假设加法的总和为x,那么减法对应的总和就是sum - x。
所以我们要求的是 x - (sum - x) = target
x = (target + sum) / 2
此时问题就转化为,装满容量为x的背包,有几种方法。
这里的x,就是bagSize,也就是我们后面要求的背包容量。
大家看到(target + sum) / 2 应该担心计算的过程中向下取整有没有影响。
这么担心就对了,例如sum 是5,S是2的话其实就是无解的,所以:
这么担心就对了,例如sum 是5,S是2的话其实就是无解的,所以:
(C++代码中,输入的S 就是题目描述的 target)
if ((S + sum) % 2 == 1) return 0; // 此时没有方案
同时如果 S的绝对值已经大于sum,那么也是没有方案的。
(C++代码中,输入的S 就是题目描述的 target)
if (abs(S) > sum) return 0; // 此时没有方案
时间复杂度:
添加时间复杂度, 示例: $O(n)$
空间复杂度:
添加空间复杂度, 示例: $O(n)$
Code
1 | class Solution { |