Programa C++ para el subconjunto mínimo de productos de una array

Dada una array a, tenemos que encontrar el mínimo producto posible con el subconjunto de elementos presentes en la array. El producto mínimo también puede ser un solo elemento.

Ejemplos: 

Input : a[] = { -1, -1, -2, 4, 3 }
Output : -24
Explanation : Minimum product will be ( -2 * -1 * -1 * 4 * 3 ) = -24

Input : a[] = { -1, 0 }
Output : -1
Explanation : -1(single element) is minimum product possible
 
Input : a[] = { 0, 0, 0 }
Output : 0

Una solución simple es generar todos los subconjuntos , encontrar el producto de cada subconjunto y devolver el producto mínimo.
Una mejor solución es usar los siguientes datos.  

  1. Si hay un número par de números negativos y ningún cero, el resultado es el producto de todos excepto el número negativo de mayor valor.
  2. Si hay un número impar de números negativos y ningún cero, el resultado es simplemente el producto de todos.
  3. Si hay ceros y positivo, no negativo, el resultado es 0. El caso excepcional es cuando no hay un número negativo y todos los demás elementos positivos, entonces nuestro resultado debe ser el primer número positivo mínimo.

C++

// CPP program to find maximum product of
// a subset.
#include <bits/stdc++.h>
using namespace std;
  
int minProductSubset(int a[], int n)
{
    if (n == 1)
        return a[0];
  
    // Find count of negative numbers, count
    // of zeros, maximum valued negative number,
    // minimum valued positive number and product
    // of non-zero numbers
    int max_neg = INT_MIN;
    int min_pos = INT_MAX;
    int count_neg = 0, count_zero = 0;
    int prod = 1;
    for (int i = 0; i < n; i++) {
  
        // If number is 0, we don't
        // multiply it with product.
        if (a[i] == 0) {
            count_zero++;
            continue;
        }
  
        // Count negatives and keep
        // track of maximum valued negative.
        if (a[i] < 0) {
            count_neg++;
            max_neg = max(max_neg, a[i]);
        }
  
        // Track minimum positive
        // number of array
        if (a[i] > 0)
            min_pos = min(min_pos, a[i]);
  
        prod = prod * a[i];
    }
  
    // If there are all zeros
    // or no negative number present
    if (count_zero == n
        || (count_neg == 0 && count_zero > 0))
        return 0;
  
    // If there are all positive
    if (count_neg == 0)
        return min_pos;
  
    // If there are even number of
    // negative numbers and count_neg not 0
    if (!(count_neg & 1) && count_neg != 0) {
  
        // Otherwise result is product of
        // all non-zeros divided by maximum
        // valued negative.
        prod = prod / max_neg;
    }
  
    return prod;
}
  
int main()
{
    int a[] = { -1, -1, -2, 4, 3 };
    int n = sizeof(a) / sizeof(a[0]);
    cout << minProductSubset(a, n);
    return 0;
}
Producción: 

-24

 

Tiempo Complejidad : O(n) 
Espacio Auxiliar : O(1)

Consulte el artículo completo sobre el subconjunto mínimo de productos de una array para obtener más detalles.

Publicación traducida automáticamente

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