# 0494. Target Sum Link: https://leetcode.com/problems/target-sum/ ###### tags: `Leetcode` `Medium` `FaceBook` `Backtracking` `Dynamic Programming` `Knapsack Problem` ## 思路 ### 思路一 Backtracking $O(2^N)$ $O(N)$(depth of the recursion tree) 直接回溯 ### 思路二 Backtracking+memo $O(N*t)$ $O(N*t)$ t是所有数之和 回溯 透过memory剪枝 记录在i个位置之后能得到某个数(target-sum)一共有几种走法 ### 思路三 DP $O(N*t)$ $O(N*t)$ 类似背包问题 只不过从判断每个物品要还是不要变成加上负的还是正的 ## Code ### 思路一 ```java= class Solution { private int ans = 0; public int findTargetSumWays(int[] nums, int target) { backtracking(nums, target, 0); return ans; } public void backtracking(int[] nums, int target, int idx){ if(idx==nums.length){ if(target==0){ ans++; } return; } backtracking(nums, target+nums[idx],idx+1); backtracking(nums, target-nums[idx],idx+1); } } ``` ### 思路二 ```java= class Solution { int total = 0; public int findTargetSumWays(int[] nums, int target) { total = Arrays.stream(nums).sum(); int[][] memo = new int[nums.length][2*total+1]; for(int[] row : memo){ Arrays.fill(row, Integer.MIN_VALUE); } return backtracking(nums, target, 0, 0, memo); } public int backtracking(int[] nums, int target, int idx, int sum, int[][] memo){ if(idx == nums.length){ if(sum == target){ return 1; } else{ return 0; } } if(memo[idx][total+sum]!=Integer.MIN_VALUE){ return memo[idx][sum+total]; } int high = backtracking(nums, target, idx+1, sum+nums[idx],memo); int low = backtracking(nums, target, idx+1, sum-nums[idx],memo); memo[idx][sum+total] = high+low; return memo[idx][sum+total]; } } ``` ### 思路三 ```java= class Solution { public int findTargetSumWays(int[] nums, int target) { int n = nums.length; int maxSum = 0; for(int i=0; i<n; i++) maxSum += nums[i]; if(target>maxSum || target<-maxSum) return 0; int[][] dp = new int[n][2*maxSum+1]; dp[0][maxSum+nums[0]]++; dp[0][maxSum-nums[0]]++; for(int i=1; i<n; i++){ for(int sum=-maxSum; sum<=maxSum; sum++){ if(Math.abs(sum-nums[i])<=maxSum) dp[i][sum+maxSum] += dp[i-1][sum+maxSum-nums[i]]; if(Math.abs(sum+nums[i])<=maxSum) dp[i][sum+maxSum] += dp[i-1][sum+maxSum+nums[i]]; } } return dp[n-1][target+maxSum]; } } ```