Given a set S of N numbers and a range specified by two numbers L (Lower Bound) and R (Upper Bound). Find the number of distinct values of all possible sums of some subset of S that lie between the given range.

Examples :

Input : S = { 1, 2, 2, 3, 5 }, L = 1 and R = 5 Output : 5Explanation :Every number between 1 and 5 can be made out using some subset of S. {1 as 1, 2 as 2, 3 as 3, 4 as 2 + 2 and 5 as 5} Input : S = { 2, 3, 5 }, L = 1 and R = 7 Output : 4Explanation :Only 4 numbers between 1 and 7 can be made out, i.e. {2, 3, 5, 7}. 3 numbers which are {1, 4, 6} can't be made out in any way.

**Prerequisites :** Bitset | Bit Manipulation

**Method 1(Simple) :** A naive approach is to generate all possible subsets of given set, calculate their sum subset wise and push them into a hashmap. Iterate over the complete given range and count the numbers which exists in the hashmap.

**Method 2(Efficient) :** An efficient way to solve this problem is by using bitset of size 10^{5}. Update the bitset for every element X by left shifting the bitset and doing bitwise OR with previous bitset so that the bitset at the new possible sums become 1. Then by using the concept of **Prefix Sums**, precompute the required count of numbers between 1 and i for prefix[1..i] to answer each query in O(1) if there are more than query being asked simultaneously. For a query L and R, answer would be simply **prefix[R] – prefix[L – 1]**

For e.g.S = { 2, 3, 5 }, L = 1 and R = 7

Considering a bitset of size 32 for simplicity. Initially 1 is at 0_{th}position of bitset

00000000000000000000000000000001

For incoming 2, left shifting the bitset by 2 and doing OR with previous bitset

00000000000000000000000000000101

Similarly for 3,

00000000000000000000000000101101

for 5,

00000000000000000000010110101101

This final bitset contains 1 at those positions(possible sums) which can be made out using some

subset of S. Hence between position 1 and 7, there are 4 set bits, thus the required answer.

**Below is the implementation of above approach in C++ :**

`// CPP Program to count the number` `// distinct values of sum of some` `// subset in a range` `#include <bits/stdc++.h>` ` ` `using` `namespace` `std;` ` ` `// Constant size for bitset` `#define SZ 100001` ` ` `int` `countOfpossibleNumbers(` `int` `S[], ` `int` `N, ` ` ` `int` `L, ` `int` `R)` `{` ` ` `// Creating a bitset of size SZ` ` ` `bitset <SZ> BS;` ` ` ` ` `// Set 0th position to 1` ` ` `BS[0] = 1;` ` ` ` ` `// Build the bitset` ` ` `for` `(` `int` `i = 0; i < N; i++) {` ` ` ` ` `// Left shift the bitset for each` ` ` `// element and taking bitwise OR` ` ` `// with previous bitset` ` ` `BS = BS | (BS << S[i]);` ` ` `}` ` ` ` ` `int` `prefix[SZ];` ` ` ` ` `// Intializing the prefix array to zero` ` ` `memset` `(prefix, 0, ` `sizeof` `(prefix));` ` ` ` ` `// Build the prefix array` ` ` `for` `(` `int` `i = 1; i < SZ; i++) {` ` ` `prefix[i] = prefix[i - 1] + BS[i];` ` ` `}` ` ` ` ` `// Answer the given query` ` ` `int` `ans = prefix[R] - prefix[L - 1];` ` ` ` ` `return` `ans;` `}` ` ` `// Driver Code to test above functions` `int` `main() ` `{` ` ` `int` `S[] = { 1, 2, 3, 5, 7 };` ` ` `int` `N = ` `sizeof` `(S) / ` `sizeof` `(S[0]);` ` ` ` ` `int` `L = 1, R = 18;` ` ` ` ` `cout << countOfpossibleNumbers(S, N, L, R);` ` ` ` ` `return` `0;` `} ` |

**Output:**

18

**Time Complexity :** O(S*Z) where S*Z is the maximum sum for given constraints, i.e. 10^{5}

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the **DSA Self Paced Course** at a student-friendly price and become industry ready.