Subset Sum (medium)
We'll cover the following
Problem Statement #
Given a set of positive numbers, determine if a subset exists whose sum is equal to a given number ‘S’.
Example 1: #
Input: {1, 2, 3, 7}, S=6
Output: True
The given set has a subset whose sum is '6': {1, 2, 3}
Example 2: #
Input: {1, 2, 7, 1, 5}, S=10
Output: True
The given set has a subset whose sum is '10': {1, 2, 7}
Example 3: #
Input: {1, 3, 4, 8}, S=6
Output: False
The given set does not have any subset whose sum is equal to '6'.
Basic Solution #
This problem follows the 0/1 Knapsack pattern and is quite similar to Equal Subset Sum Partition. A basic brute-force solution could be to try all subsets of the given numbers to see if any set has a sum equal to ‘S’.
So our brute-force algorithm will look like:
Since this problem is quite similar to Equal Subset Sum Partition, let’s jump directly to the bottom-up dynamic programming solution.
Bottom-up Dynamic Programming #
We’ll try to find if we can make all possible sums with every subset to populate the array dp[TotalNumbers][S+1]
.
For every possible sum ‘s’ (where 0 <= s <= S), we have two options:
- Exclude the number. In this case, we will see if we can get the sum ‘s’ from the subset excluding this number =>
dp[index-1][s]
- Include the number if its value is not more than ‘s’. In this case, we will see if we can find a subset to get the remaining sum =>
dp[index-1][s-num[index]]
If either of the above two scenarios returns true, we can find a subset with a sum equal to ‘s’.
Let’s draw this visually, with the example input {1, 2, 3, 7}, and start with our base case of size zero:
Code #
Here is the code for our bottom-up dynamic programming approach:
Similar to the space optimized solution for 0/1 Knapsack