Iterating over all possible combinations in an Array using Bits

03 Jun, 2021
There arise 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 task 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 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++
Java
Python3
C#
PHP
Javascript
// C++ program to iterate over all possible// combinations of array elements #include <bits/stdc++.h>using namespace std; // Function to check if any combination of// elements of the array sums to kbool 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 Codeint 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 program to iterate over all possible// combinations of array elementsclass GFG{     // Function to check if any combination// of elements of the array sums to kstatic 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 Codepublic 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
# 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 kdef 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 Codeif __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# program to iterate over all possible// combinations of array elementsusing System;class GFG{// Function to check if any combination// of elements of the array sums to kstatic 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 elementsusing System; class GFG{     // Function to check if any combination// of elements of the array sums to kstatic 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 Codepublic 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// PHP program to iterate over all possible// combinations of array elements // Function to check if any combination of// elements of the array sums to kfunction 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 = 0; $i <= $range; $i++)    {         $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    $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?>
<script>    // Javascript program to iterate over all possible    // combinations of array elements         // Function to check if any combination    // of elements of the array sums to k    function checkSum(a, n, k)    {        // Flag variable to check if        // sum exists        let flag = 0;         // Calculate number of bits        let range = (1 << n) - 1;         // Generate combinations using bits        for (let i = 0; i <= range; i++)        {            let 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;    }         let k = 6;    let a = [ 3, 4, 1, 2 ];    let n = a.length;    if (checkSum(a, n, k))        document.write("Yes");    else        document.write("No");      </script>
Yes
 
Time complexity : 2(number of bits) 
ankthon
Code_Mech
SURENDRA_GANGWAR
rameshtravel07
Arrays
Bit Magic
Combinatorial
Arrays
Bit Magic
Combinatorial
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Introduction to Data Structures
Window Sliding Technique
Search, insert and delete in an unsorted array
What is Data Structure: Types, Classifications and Applications
Chocolate Distribution Problem
Bitwise Operators in C/C++
Left Shift and Right Shift Operators in C/C++
Travelling Salesman Problem | Set 1 (Naive and Dynamic Programming)
Count set bits in an integer
How to swap two numbers without using a temporary variable?