心路历程:
这道题的递推关系很明显,类似于一个背包问题,按照背包问题的建模方式即可。
状态:从头开始以nums[i]结尾的子数组,当前目标和
动作:选择加号还是减号
返回值:有多少种可能的组合
解法:动态规划
class Solution:
def findTargetSumWays(self, nums: List[int], target: int) -> int:
# dp问题
@cache
def dp(i, targeti):
if i == 0:
return int(targeti == nums[0]) + int(targeti == -nums[0])
return dp(i-1, targeti-nums[i]) + dp(i-1, targeti+nums[i])
return dp(len(nums) - 1, target)