Leetcode 416. Partition Equal Subset Sum
题目
解析
这其实是个0,1背包问题,设所有数字和为sum,我们的目标是选取一部分物品,使得它们 的总和为 sum/2,只是这道题不需要考虑价值。和前面几道题目一样,这个题目的典型解法还是动态规划,但是我先写recursion的方法,然后看动态规划和recursion之间的对应.至于0,1问题,后面单开一篇文章来讲好了
解法1:recursion + memorization
更前面那些动态规划的题目一样,这边我还是从recursion开始,recursion的逻辑也很简单,设一个remain值,代表当前还需要多少值才能达到我们的target值,target值为sum的一半。每一级recursion的结果有两种情况,一种是包含当前值,一种是跳过当前值。
python代码如下:
class Solution:
def canPartition(self, nums: List[int]) -> bool:
def dfs(idx,remain):
if idx>=len(nums) or remain<0:
return False
if remain in memo:
return memo[remain]
if remain == 0:
return True
memo[remain] = dfs(idx+1,remain-nums[idx]) or dfs(idx+1,remain)
return memo[remain]
解法2:动态规划
定义一个二维bool值dp数组,dp[i][j]代表当到nums数组的i位置时,是否能够合成sum=j。状态转移方程为:
dp[i][j] = dp[i-1][j] || dp[i-1][j-nums[i