Iterating over all possible combinations in an Array using Bits

There arises several situations while solving a problem where we need to iterate over all possible combinations of an array. In this article, we will discuss the method of using bits to do so.

For the purpose of explaining, consider the following question:

Given an array b[] = {2, 1, 4}. The tasks is to check if there exists any combination of elements of this array whose sum of elements is equal to k = 6.

Solution using Bit operations:
As there are 3 elements in this array, hence we need 3 bits to represent each of the numbers. A bit set as 1 corresponding to the element means it is included while calculating the sum, and not if it is 0.

The possible combinations possible are:

```000 : No element is selected.
001 : 4 is selected.
010 : 1 is selected.
011 : 1 and 4 are selected.
100 : 2 is selected.
101 : 2 and 4 are selected.
110 : 2 and 1 are selected.
111 : All elements are selected.
```

Hence the range required to access all these bits is 0 – 7. We iterate over each bit of each of the possible combinations, and check for each combination if the sum of chosen elements is equal to the required sum or not.

Examples:

```Input : A = {3, 4, 1, 2} and k = 6
Output : YES
Here, the combination of using 3, 1 and 2 yields
the required sum.

Input : A = {3, 4, 1, 2} and k = 11
Output : NO
```

Below is the implementation of the above approach:

C++

 `// C++ program to iterate over all possible ` `// combinations of array elements ` ` `  `#include ` `using` `namespace` `std; ` ` `  `// Function to check if any combination of ` `// elements of the array sums to k ` `bool` `checkSum(``int` `a[], ``int` `n, ``int` `k) ` `{ ` `    ``// Flag variable to check if ` `    ``// sum exists ` `    ``int` `flag = 0; ` ` `  `    ``// Calculate number of bits ` `    ``int` `range = (1 << n) - 1; ` ` `  `    ``// Generate combinations using bits ` `    ``for` `(``int` `i = 0; i <= range; i++) { ` ` `  `        ``int` `x = 0, y = i, sum = 0; ` ` `  `        ``while` `(y > 0) { ` ` `  `            ``if` `(y & 1 == 1) { ` ` `  `                ``// Calculate sum ` `                ``sum = sum + a[x]; ` `            ``} ` `            ``x++; ` `            ``y = y >> 1; ` `        ``} ` ` `  `        ``// If sum is found, set flag to 1 ` `        ``// and terminate the loop ` `        ``if` `(sum == k)  ` `           ``return` `true``; ` `    ``} ` ` `  `    ``return` `false``; ` `} ` ` `  `// Driver Code ` `int` `main() ` `{ ` `    ``int` `k = 6; ` `    ``int` `a[] = { 3, 4, 1, 2 }; ` `    ``int` `n = ``sizeof``(a)/``sizeof``(a[0]); ` `    ``if` `(checkSum(a, n, k)) ` `       ``cout << ``"Yes"``; ` `    ``else` `       ``cout << ``"No"``; ` ` `  `    ``return` `0; ` `} `

Java

 `// Java program to iterate over all possible ` `// combinations of array elements ` `class` `GFG ` `{ ` `     `  `// Function to check if any combination  ` `// of elements of the array sums to k ` `static` `boolean` `checkSum(``int` `a[], ``int` `n, ``int` `k) ` `{ ` `    ``// Flag variable to check if ` `    ``// sum exists ` `    ``int` `flag = ``0``; ` ` `  `    ``// Calculate number of bits ` `    ``int` `range = (``1` `<< n) - ``1``; ` ` `  `    ``// Generate combinations using bits ` `    ``for` `(``int` `i = ``0``; i <= range; i++)  ` `    ``{ ` `        ``int` `x = ``0``, y = i, sum = ``0``; ` ` `  `        ``while` `(y > ``0``)  ` `        ``{ ` `            ``if` `((y & ``1``) == ``1``) ` `            ``{ ` ` `  `                ``// Calculate sum ` `                ``sum = sum + a[x]; ` `            ``} ` `            ``x++; ` `            ``y = y >> ``1``; ` `        ``} ` ` `  `        ``// If sum is found, set flag to 1 ` `        ``// and terminate the loop ` `        ``if` `(sum == k)  ` `        ``return` `true``; ` `    ``} ` ` `  `    ``return` `false``; ` `} ` ` `  `// Driver Code ` `public` `static` `void` `main(String[] args) ` `{ ` `    ``int` `k = ``6``; ` `    ``int` `a[] = { ``3``, ``4``, ``1``, ``2` `}; ` `    ``int` `n = a.length; ` `    ``if` `(checkSum(a, n, k)) ` `    ``System.out.println(``"Yes"``); ` `    ``else` `    ``System.out.println(``"No"``); ` ` `  `} ` `} ` ` `  `// This code is contributed ` `// by Code_Mech `

Python3

 `# Python 3 program to iterate over all  ` `# possible combinations of array elements ` ` `  `# Function to check if any combination of ` `# elements of the array sums to k ` `def` `checkSum(a, n, k): ` `     `  `    ``# Flag variable to check if ` `    ``# sum exists ` `    ``flag ``=` `0` ` `  `    ``# Calculate number of bits ` `    ``range__ ``=` `(``1` `<< n) ``-` `1` ` `  `    ``# Generate combinations using bits ` `    ``for` `i ``in` `range``(range__ ``+` `1``): ` `        ``x ``=` `0` `        ``y ``=` `i ` `        ``sum` `=` `0` ` `  `        ``while` `(y > ``0``): ` `            ``if` `(y & ``1` `=``=` `1``): ` `                 `  `                ``# Calculate sum ` `                ``sum` `=` `sum` `+` `a[x] ` ` `  `            ``x ``+``=` `1` `            ``y ``=` `y >> ``1` ` `  `        ``# If sum is found, set flag to 1 ` `        ``# and terminate the loop ` `        ``if` `(``sum` `=``=` `k): ` `            ``return` `True` ` `  `    ``return` `False` ` `  `# Driver Code ` `if` `__name__ ``=``=` `'__main__'``: ` `    ``k ``=` `6` `    ``a ``=` `[``3``, ``4``, ``1``, ``2``] ` `    ``n ``=` `len``(a) ` `    ``if` `(checkSum(a, n, k)): ` `        ``print``(``"Yes"``) ` `    ``else``: ` `        ``print``(``"No"``) ` `         `  `# This code is contributed by ` `# Surendra_Gangwar `

C#

 `// C# program to iterate over all possible ` `// combinations of array elements ` `using` `System; ` `class` `GFG ` `{ ` `// Function to check if any combination  ` `// of elements of the array sums to k ` `static` `bool` `checkSum(``int``[] a, ``int` `n, ``int` `k) ` `{ ` `    ``// Flag variable to check if ` `    ``// sum exists ` `    ``int` `// C# program to iterate over all possible ` `// combinations of array elements ` `using` `System; ` ` `  `class` `GFG ` `{ ` `     `  `// Function to check if any combination  ` `// of elements of the array sums to k ` `static` `bool` `checkSum(``int``[] a, ``int` `n, ``int` `k) ` `{ ` `    ``// Flag variable to check if ` `    ``// sum exists ` `    ``int` `flag = 0; ` ` `  `    ``// Calculate number of bits ` `    ``int` `range = (1 << n) - 1; ` ` `  `    ``// Generate combinations using bits ` `    ``for` `(``int` `i = 0; i <= range; i++)  ` `    ``{ ` `        ``int` `x = 0, y = i, sum = 0; ` ` `  `        ``while` `(y > 0)  ` `        ``{ ` `            ``if` `((y & 1) == 1) ` `            ``{ ` ` `  `                ``// Calculate sum ` `                ``sum = sum + a[x]; ` `            ``} ` `            ``x++; ` `            ``y = y >> 1; ` `        ``} ` ` `  `        ``// If sum is found, set flag to 1 ` `        ``// and terminate the loop ` `        ``if` `(sum == k)  ` `        ``return` `true``; ` `    ``} ` ` `  `    ``return` `false``; ` `} ` ` `  `// Driver Code ` `public` `static` `void` `Main() ` `{ ` `    ``int` `k = 6; ` `    ``int``[] a = { 3, 4, 1, 2 }; ` `    ``int` `n = a.Length; ` `    ``if` `(checkSum(a, n, k)) ` `    ``Console.WriteLine(``"Yes"``); ` `    ``else` `    ``Console.WriteLine(``"No"``); ` `} ` `} ` ` `  `// This code is contributed ` `// by Code_Mech `

PHP

 ` 0) ` `        ``{  ` ` `  `            ``if` `(``\$y` `& 1 == 1)  ` `            ``{  ` ` `  `                ``// Calculate sum  ` `                ``\$sum` `= ``\$sum` `+ ``\$a``[``\$x``];  ` `            ``}  ` `            ``\$x``++;  ` `            ``\$y` `= ``\$y` `>> 1;  ` `        ``}  ` ` `  `        ``// If sum is found, set flag to 1  ` `        ``// and terminate the loop  ` `        ``if` `(``\$sum` `== ``\$k``)  ` `        ``return` `true;  ` `    ``}  ` ` `  `    ``return` `false;  ` `}  ` ` `  `    ``// Driver Code  ` `    ``\$k` `= 6;  ` `    ``\$a` `= ``array``( 3, 4, 1, 2 );  ` `    ``\$n` `= sizeof(``\$a``);  ` `    ``if` `(checkSum(``\$a``, ``\$n``, ``\$k``))  ` `        ``echo` `"Yes"``;  ` `    ``else` `        ``echo` `"No"``;  ` ` `  `    ``// This code is contributed by Ryuga ` `?> `

Output:

```Yes
```

Time complexity : 2(number of bits)

My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.