Target Sum dp

Description

Leetcode 494. 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
1
2
3
4
5
6
7
8

Example 2:

Input: nums = [1], target = 1
Output: 1
1
2

Constraints:

1 <= nums.length <= 20
0 <= nums[i] <= 1000
0 <= sum(nums[i]) <= 1000
-1000 <= target <= 1000
1
2
3
4

Solution

class Solution
{
public:
    int lastStoneWeightII(vector<int> &stones)
    {
        // to get the minimum weight of last stone, we can try to segregate stones into two equal weight subsets

        // 1.make an example
        // 2.consider exceptions
        if (stones.size() == 1)
            return stones[0];

        // 3.find target capacity
        int sum = 0;
        for (int a : stones)
        {
            sum += a;
        }

        int target = sum / 2; // try to find subset with a sum close to target

        // 4.dp[j]: for subsets with a capacity of j, the actual maximum sum of elements is dp[j]
        vector<int> dp(target + 1, 0);

        // 5.equation and traversal
        for (int i = 0; i < stones.size(); i++)
        {
            for (int j = target; j >= stones[i]; --j)
            {
                dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);
            }
        }

        int subset1 = dp[target];
        int subset2 = sum - subset1;
        return (subset2 - subset1);
    }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Last Updated: 7/22/2023, 8:15:08 AM
Contributors: oddnaveed