https://github.com/azl397985856/leetcode/blob/master/problems/416.partition-equal-subset-sum.md
题目分析
这里需要进行一定的题目转化,我们把该集合分割成两个子集合,子集合的和相等,即sum_s1 = sum_s2。还是运用正反向思维,两个子集合的和加起来等于整个集合的和,那么整个集合的和除以2=子集合的和。问题转化为了在整个子集合中,能否选出n个数,凑够sum/2。
这时候应该有两种思路;
- DFS
最直观的想法就是枚举,枚举的话就是利用递归的方法,类似于DFS了。 - 背包
这个符合背包问题的特征:从一个集合里选出元素,这些元素凑起来,每个元素要么选要么不选。
根据题目确定状态dp[i][j],i表示不同的集合,j表示凑出来不同的东西。
dp【i】【j】表示用前n个元素组成的集合是否能够凑出来和为j。
写状态转移方程,base情况之后,问题就解决了。
关键点
- 问题转化
- 背包问题特征
- 递归和正反思维