## [494\. Target Sum](https://leetcode.com/problems/target-sum/) You are given an integer array `nums` and an integer `target`. You want to build an **expression** out of nums by adding one of the symbols `'+'` and `'-'` before each integer in nums and then concatenate all the integers. - For example, if `nums = [2, 1]`, you can add a `'+'` before `2` and a `'-'` before `1` and concatenate them to build the expression `"+2-1"`. Return the number of different **expressions** that you can build, which evaluates to `target`. **Example 1:** **Input:** nums = \[1,1,1,1,1\], target = 3 **Output:** 5 **Explanation:** There are 5 ways to assign symbols to make the sum of nums be target 3. -1 + 1 + 1 + 1 + 1 = 3 +1 - 1 + 1 + 1 + 1 = 3 +1 + 1 - 1 + 1 + 1 = 3 +1 + 1 + 1 - 1 + 1 = 3 +1 + 1 + 1 + 1 - 1 = 3 **Example 2:** **Input:** nums = \[1\], target = 1 **Output:** 1 **Constraints:** - `1 <= nums.length <= 20` - `0 <= nums[i] <= 1000` - `0 <= sum(nums[i]) <= 1000` - `-1000 <= target <= 1000` 2 維 DP ```cpp= class Solution { public: int findTargetSumWays(vector<int>& nums, int target) { int n = nums.size(); // row 是個數,後續的空間優化可以拿掉他,因為我們不需要知道個數 // map 的 key 是總和,val 是計數 count vector<unordered_map<int, int>> dp(n + 1); // 起始值是 1 dp[0][0] = 1; // i 指的是 nums 的 index for(int i = 0; i < n; ++i) { // 將結果存到 dp 表格中 for(auto a : dp[i]) { int sum = a.first, count = a.second; // 對於每個數字我們可以選擇將其加上或減去 // 加法的情況 dp[i + 1][sum + nums[i]] += count; // 減法的情況 dp[i + 1][sum - nums[i]] += count; } } return dp[n][target]; } }; ``` :::success - 時間複雜度:$O(T \cdot N)$ - 空間複雜度:$O(T \cdot N)$ ::: DP 空間改進 ```cpp= class Solution { public: int findTargetSumWays(vector<int>& nums, int target) { unordered_map<int, int> dp; // 初始值是 1 dp[0] = 1; for (int num : nums) { unordered_map<int, int> t; for (auto a : dp) { // key 存 sum 的總和 int sum = a.first, count = a.second; // 對於每個數字我們可以選擇將其加上或減去 // 加法的情況 t[sum + num] += count; // 減法的情況 t[sum - num] += count; } dp = t; } return dp[target]; } }; ``` :::success - 時間複雜度:$O(T \cdot N)$ - 空間複雜度:$O(T)$ :::