查找 -1 和 +1 的数组中是否存在任何大小为 K 且总和为 0 的子集
给定一个整数K和一个仅包含1和-1的数组arr ,任务是查找是否存在任何大小为K且其元素之和为0的子集。
例子:
Input: arr[] = {1, -1, 1}, K = 2
Output: Yes
{1, -1} is a valid subset
Input: arr[] = {1, 1, -1, -1, 1}, K = 5
Output: No
方法:
- 为了使总和为0 ,子集中的1和-1的数量必须相等。
- 如果K是奇数,则没有子集将满足给定条件。
- 否则,如果K是偶数,那么我们需要准确地选择(K / 2) 1 和(K / 2) -1 以形成子集,使其所有元素的总和为0
- 因此,如果K是偶数且1 的数量 ≥ K / 2且-1 的数量 ≥ K / 2则打印Yes否则打印No 。
下面是上述方法的实现:
C++
// C++ program to find if there is a subset of size
// k with sum 0 in an array of -1 and +1
#include
using namespace std;
// Function to return the number of 1's in the array
int countOnes(int n, int a[])
{
int i, count = 0;
for (i = 0; i < n; i++)
if (a[i] == 1)
count++;
return count;
}
bool isSubset(int arr[], int n, int k)
{
int countPos1 = countOnes(n, arr);
int countNeg1 = n - countPos1;
// If K is even and there are
// at least K/2 1's and -1's
return (k % 2 == 0 && countPos1 >= k / 2 &&
countNeg1 >= k / 2);
}
// Driver Program to test above function
int main()
{
int a[] = { 1, 1, -1, -1, 1 };
int n = sizeof(a) / sizeof(a[0]);
int k = 5;
if (isSubset(a, n, k))
cout << "Yes";
else
cout << "No";
return 0;
}
Java
// Java program to find if there is a subset of size
// k with sum 0 in an array of -1 and +1
import java.io.*;
class GFG {
// Function to return the number of 1's in the array
static int countOnes(int n, int a[])
{
int i, count = 0;
for (i = 0; i < n; i++)
if (a[i] == 1)
count++;
return count;
}
static boolean isSubset(int arr[], int n, int k)
{
int countPos1 = countOnes(n, arr);
int countNeg1 = n - countPos1;
// If K is even and there are
// at least K/2 1's and -1's
return (k % 2 == 0 && countPos1 >= k / 2 &&
countNeg1 >= k / 2);
}
// Driver Program to test above function
public static void main (String[] args) {
int []a = { 1, 1, -1, -1, 1 };
int n = a.length;
int k = 5;
if (isSubset(a, n, k))
System.out.println( "Yes");
else
System.out.println( "No");
}
}
// This code is contributed by shs
Python3
# Python3 program to find if there is
# a subset of size k with sum 0 in an
# array of -1 and +1
# Function to return the number of
# 1's in the array
def countOnes(n, a):
count = 0
for i in range(0, n):
if a[i] == 1:
count += 1
return count
def isSubset(arr, n, k):
countPos1 = countOnes(n, arr)
countNeg1 = n - countPos1
# If K is even and there are
# at least K/2 1's and -1's
return (k % 2 == 0 and countPos1 >= k // 2 and
countNeg1 >= k // 2)
# Driver Code
if __name__ == "__main__":
a = [1, 1, -1, -1, 1]
n = len(a)
k = 5
if isSubset(a, n, k) == True:
print("Yes")
else:
print("No")
# This code is contributed
# by Rituraj Jain
C#
// C# program to find if there is
// a subset of size k with sum 0
// in an array of -1 and +1
using System;
class GFG
{
// Function to return the number
// of 1's in the array
static int countOnes(int n, int []a)
{
int i, count = 0;
for (i = 0; i < n; i++)
if (a[i] == 1)
count++;
return count;
}
static bool isSubset(int []arr,
int n, int k)
{
int countPos1 = countOnes(n, arr);
int countNeg1 = n - countPos1;
// If K is even and there are
// at least K/2 1's and -1's
return (k % 2 == 0 && countPos1 >= k / 2 &&
countNeg1 >= k / 2);
}
// Driver Code
public static void Main ()
{
int []a = { 1, 1, -1, -1, 1 };
int n = a.Length;
int k = 5;
if (isSubset(a, n, k))
Console.WriteLine( "Yes");
else
Console.WriteLine( "No");
}
}
// This code is contributed by shs
PHP
= $k / 2 &&
$countNeg1 >= $k / 2);
}
// Driver Code
$a = array(1, 1, -1, -1, 1);
$n = sizeof($a);
$k = 5;
if (isSubset($a, $n, $k))
echo "Yes";
else
echo "No";
// This code is contributed
// by Akanksha Rai
?>
Javascript
输出:
No
时间复杂度: O(n)