Encuentre si hay algún subconjunto de tamaño K con suma 0 en una array de -1 y +1

Dado un entero K y una array arr que contiene solo 1 y -1 , la tarea es encontrar si hay algún subconjunto de tamaño K cuyos elementos sean 0 .
Ejemplos: 
 

Entrada: arr[] = {1, -1, 1}, K = 2 
Salida: Sí 
{1, -1} es un subconjunto válido
Entrada: arr[] = {1, 1, -1, -1, 1} , K = 5 
Salida: No 
 

Acercarse: 
 

  • Para que la suma sea 0 , tiene que haber igual número de 1 y -1 en el subconjunto.
  • Si K es impar, ningún subconjunto satisfará la condición dada.
  • De lo contrario, si K es par, entonces debemos elegir exactamente (K / 2) 1 y (K / 2) -1 para formar el subconjunto de modo que la suma de todos sus elementos sea 0
  • Entonces, si K es par y el número de 1 ≥ K / 2 y el número de -1 ≥ K / 2 , imprima ; de lo contrario, imprima No.

A continuación se muestra la implementación del enfoque anterior: 
 

C++

// C++ program to find if there is a subset of size
// k with sum 0 in an array of -1 and +1
#include <bits/stdc++.h>
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

<?php
// PHP 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
function countOnes($n, $a)
{
    $count = 0;
    for ($i = 0; $i < $n; $i++)
        if ($a[$i] == 1)
            $count++;
    return $count;
}
 
function 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 && $countPos1 >= $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

<script>
 
// Javascript 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
function countOnes(n, a)
{
    var i, count = 0;
    for (i = 0; i < n; i++)
        if (a[i] == 1)
            count++;
    return count;
}
 
function isSubset(arr, n, k)
{
    var countPos1 = countOnes(n, arr);
    var 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
var a = [1, 1, -1, -1, 1];
var n = a.length;
var k = 5;
if (isSubset(a, n, k))
  document.write( "Yes");
else
  document.write( "No");
 
// This code is contributed by famously.
</script>
Producción: 

No

 

Complejidad de tiempo: O(n)
 

Publicación traducida automáticamente

Artículo escrito por Abdullah Aslam y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *