494. 目标和 - 力扣(LeetCode) (leetcode-cn.com)https://leetcode-cn.com/problems/target-sum/
1.DFS--暴力搜索O(n^2)
class Solution:
def findTargetSumWays(self, nums: List[int], target: int) -> int:
def dfs(nums,ans,i,target):
if i==len(nums):
return 1 if ans==target else 0
left=dfs(nums,ans+nums[i],i+1,target)
right=dfs(nums,ans-nums[i],i+1,target)
return left+right
res=dfs(nums,0,0,target)
return res
2.动态规划--O(n*neg)
Step1. 转换为背包问题:
背包容量可以为neg也可以为pos,但要注意,凑pos和凑neg的判断条件有区别,目标是一致的,就是存在正部和副部,
所以当要凑neg时,合法条件是diff=sums-target>0
当要凑pos时,合法条件是diff=sums+target>0
Step2.异常情况判定:neg为非负 整数
sums-target>0=0 and (sums-target)%2==0
Step3. j开始的位置:0
需要注意的是,j的更新范围是【0,bag+1)
注意0, 因为这个数组可能要凑0
class Solution(object):
def findTargetSumWays(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
sums=sum(nums)
if target>sums or (sums-target)%2==1:
return 0
bag=int((sums-target)/2)
dp=[[0]*(bag+1) for _ in range(len(nums)+1)]
for i in range(len(nums)+1):
dp[i][0]=1
for i in range(1,len(nums)+1):
for j in range(bag+1):
if j>=nums[i-1]:
dp[i][j]=dp[i-1][j]+dp[i-1][j-nums[i-1]]
else:
dp[i][j]=dp[i-1][j]
return dp[-1][-1]
时间复杂度:O(n*neg)
空间复杂度:O(n*neg)但可降低道O(neg)
背包问题合集力扣