El valor más grande de K que un conjunto de todos los posibles valores de suma de subconjuntos de Array dado contiene números [0, K]

Dada una array arr[] de N enteros, la tarea es encontrar el recuento máximo de K , es decir, enteros consecutivos de 0 a K, que está presente en el conjunto S , donde S contiene todos los valores posibles de suma de subconjuntos de los array array [] .

Ejemplos:

Entrada: arr[] = {1, 3}
Salida: 2
Explicación: Los posibles subconjuntos son {}, {1}, {3}, {1, 3} y sus respectivas sumas son {0, 1, 3, 4} . Por lo tanto, la cuenta máxima de números enteros consecutivos a partir de 0 en el conjunto que contiene todas las sumas de los subconjuntos es 2 (es decir, {0, 1}).

Entrada: arr[] = {1, 1, 1, 4}
Salida: 8
Explicación: El conjunto que contiene todas las sumas de subconjuntos de la array dada es {0, 1, 2, 3, 4, 5, 6, 7}. Por lo tanto, el recuento máximo de enteros consecutivos a partir de 0 es 8.

 

Enfoque ingenuo: el problema dado se puede resolver utilizando la programación dinámica manteniendo todas las sumas de subconjuntos posibles en una array que se realiza utilizando la técnica de la mochila . A partir de entonces, calcular el recuento máximo de enteros consecutivos.

Complejidad de tiempo: O(N*K) donde K representa la suma de todos los elementos en la array arr[] .
Espacio Auxiliar: O(K)

Enfoque eficiente: el problema anterior se puede resolver utilizando un enfoque codicioso . Supongamos que el conjunto que contiene todas las sumas de subconjuntos de la array arr[] contiene todos los enteros en el rango [0, X] . Si se introduce un nuevo número Y en la array, todos los enteros en el rango [Y, X + Y] también serán posibles como la suma del subconjunto. Usando esta observación, el problema dado se puede resolver siguiendo los pasos a continuación: 

  • Ordena la array dada en orden no decreciente.
  • Mantenga una variable, digamos X como 0 , lo que denota que los enteros en el rango [0, X] son ​​posibles como la suma del subconjunto de la array dada arr[] .
  • Para mantener la continuidad de enteros consecutivos, arr[i] <= X + 1 debe cumplirse. Por lo tanto, recorra la array dada para cada i en el rango [0, N) , si el valor de arr[i] <= X + 1 , luego actualice el valor de X = X + arr[i] . De lo contrario, sal del bucle .
  • Después de completar los pasos anteriores, el conteo de enteros en el rango [0, X] es decir, (X + 1) .

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

C++

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to find maximum count of
// consecutive integers from 0 in set
// S of all possible subset-sum
int maxConsecutiveCnt(vector<int> arr)
{
    // Stores the maximum possible integer
    int X = 0;
 
    // Sort the given array in
    // non-decreasing order
    sort(arr.begin(), arr.end());
 
    // Iterate the given array
    for (int i = 0; i < arr.size(); i++) {
 
        // If arr[i] <= X+1, then update
        // X otherwise break the loop
        if (arr[i] <= (X + 1)) {
            X = X + arr[i];
        }
        else {
            break;
        }
    }
 
    // Return Answer
    return X + 1;
}
 
// Driver Code
int main()
{
    vector<int> arr = { 1, 1, 1, 4 };
    cout << maxConsecutiveCnt(arr);
 
    return 0;
}

Java

// Java program for the above approach
import java.util.Arrays;
 
class GFG {
 
    // Function to find maximum count of
    // consecutive integers from 0 in set
    // S of all possible subset-sum
    public static int maxConsecutiveCnt(int[] arr)
    {
       
        // Stores the maximum possible integer
        int X = 0;
 
        // Sort the given array in
        // non-decreasing order
        Arrays.sort(arr);
 
        // Iterate the given array
        for (int i = 0; i < arr.length; i++) {
 
            // If arr[i] <= X+1, then update
            // X otherwise break the loop
            if (arr[i] <= (X + 1)) {
                X = X + arr[i];
            } else {
                break;
            }
        }
 
        // Return Answer
        return X + 1;
    }
 
    // Driver Code
    public static void main(String args[]) {
        int[] arr = { 1, 1, 1, 4 };
        System.out.println(maxConsecutiveCnt(arr));
    }
}
 
// This code is contributed by gfgking.

Python3

# python program for the above approach
 
# Function to find maximum count of
# consecutive integers from 0 in set
# S of all possible subset-sum
def maxConsecutiveCnt(arr):
 
    # Stores the maximum possible integer
    X = 0
 
    # Sort the given array in
    # non-decreasing order
    arr.sort()
 
    # Iterate the given array
    for i in range(0, len(arr)):
 
        # If arr[i] <= X+1, then update
        # X otherwise break the loop
        if (arr[i] <= (X + 1)):
            X = X + arr[i]
 
        else:
            break
 
    # Return Answer
    return X + 1
 
# Driver Code
if __name__ == "__main__":
 
    arr = [1, 1, 1, 4]
    print(maxConsecutiveCnt(arr))
 
# This code is contributed by rakeshsahni

C#

// C# program for the above approach
using System;
class GFG
{
 
    // Function to find maximum count of
    // consecutive integers from 0 in set
    // S of all possible subset-sum
    public static int maxConsecutiveCnt(int[] arr)
    {
 
        // Stores the maximum possible integer
        int X = 0;
 
        // Sort the given array in
        // non-decreasing order
        Array.Sort(arr);
 
        // Iterate the given array
        for (int i = 0; i < arr.Length; i++)
        {
 
            // If arr[i] <= X+1, then update
            // X otherwise break the loop
            if (arr[i] <= (X + 1))
            {
                X = X + arr[i];
            }
            else
            {
                break;
            }
        }
 
        // Return Answer
        return X + 1;
    }
 
    // Driver Code
    public static void Main()
    {
        int[] arr = { 1, 1, 1, 4 };
        Console.Write(maxConsecutiveCnt(arr));
    }
}
 
// This code is contributed by gfgking.

Javascript

       // JavaScript Program to implement
        // the above approach
 
        // Function to find maximum count of
        // consecutive integers from 0 in set
        // S of all possible subset-sum
        function maxConsecutiveCnt(arr)
        {
         
            // Stores the maximum possible integer
            let X = 0;
 
            // Sort the given array in
            // non-decreasing order
            arr.sort(function (a, b) { return a - b })
 
            // Iterate the given array
            for (let i = 0; i < arr.length; i++) {
 
                // If arr[i] <= X+1, then update
                // X otherwise break the loop
                if (arr[i] <= (X + 1)) {
                    X = X + arr[i];
                }
                else {
                    break;
                }
            }
 
            // Return Answer
            return X + 1;
        }
 
        // Driver Code
        let arr = [1, 1, 1, 4];
        document.write(maxConsecutiveCnt(arr));
 
// This code is contributed by Potta Lokesh
    </script>
Producción: 

8

 

Complejidad de tiempo: O(N*log N)
Espacio auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por kartikmodi 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 *