在解决问题时会出现几种情况,我们需要遍历数组的所有可能组合。在本文中,我们将讨论使用位执行此操作的方法。
为了说明的目的,请考虑以下问题:
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.
使用位操作的解决方案:
由于此数组中有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 (位数)