Leetcode 494. Target Sum
题目
解析:
这个题目本质上也是个背包问题。一般来说背包问题用动态规划来解比较常见,但是这道题比较特殊,我比较推荐用recursion的方法来解。虽然从本质上来讲,recursion + memorization和动态规划是一样的,但是对于这道题木还是recursion更容易理解一些
解法1:recursion + memorization
假设在位置I,和为sum的解为F(i,sum), 那么关键在于我们要识别他的sub poblem是什么,因为这道题目的设定是,可以加或者减,所以F(i,sum) = F(i+1,sum+curr_num) + F(i,sum-curr_num)。然后为了加快速度,用一个字典来保存已经算过的状态避免重复计算。
python代码如下:
class Solution:
def findTargetSumWays(self, nums: List[int], S: int) -> int:
def dfs(idx,curr_sum):
if idx == len(nums):
if curr_sum == S:
return 1
return 0
if (idx,curr_sum) in memo:
return memo[(idx,curr_sum)]
add_curr = dfs(idx+1,curr_sum+nums[idx])
sub_curr = dfs(idx+1,curr_sum-nums[idx])
memo[(idx,curr_sum)] = add_curr + sub_curr
return memo[(idx,curr_sum)]
memo = {
}
return dfs(0,0)
m,n = len(nums),S
dp = [[0]*(n+1) for _ in range