📌  相关文章
📜  使用位迭代数组中所有可能的组合

📅  最后修改于: 2021-04-27 21:15:44             🧑  作者: Mango

在解决问题时会出现几种情况,我们需要遍历数组的所有可能组合。在本文中,我们将讨论使用位执行此操作的方法。

为了说明的目的,请考虑以下问题:

使用位操作的解决方案
由于此数组中有3个元素,因此我们需要3位来表示每个数字。设置为1的元素对应的位表示在计算总和时将其包括在内,如果该位为0,则不包括在内。

可能的组合是:

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.

因此,访问所有这些位所需的范围是0 –7。我们对每个可能组合的每个位进行迭代,并检查每个组合是否所选元素的总和等于所需总和。

例子:

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

下面是上述方法的实现:

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
?>


输出:
Yes

时间复杂度:2 (位数)