Suma de los productos de todos los Subconjuntos posibles

Dada una array de n enteros no negativos. La tarea es encontrar la suma del producto de elementos de todos los subconjuntos posibles. Se puede suponer que los números en los subconjuntos son pequeños y que el producto informático no provoca un desbordamiento aritmético.

Ejemplo : 

Input : arr[] = {1, 2, 3}
Output : 23
Possible Subset are: 1, 2, 3, {1, 2}, {1, 3}, 
                     {2, 3}, {1, 2, 3}
Products of elements in above subsets :
1, 2, 3, 2, 3, 6, 6
Sum of all products = 1 + 2 + 3 + 2 + 3 + 6 + 6 
                    = 23

Enfoque ingenuo: el enfoque simple es generar todos los subconjuntos posibles uno por uno y calcular la suma de todos los elementos. La complejidad temporal de este enfoque es exponencial ya que hay un total de 2 n – 1 subconjuntos.

Un enfoque eficiente es generalizar todo el problema en algún patrón. Supongamos que tenemos dos números a y b. Podemos escribir todos los productos de subconjuntos posibles como: – 

   = a + b + ab 
   = a(1+b) + b + 1 - 1 
   = a(1+b) + (1+b) - 1 
   = (a + 1) * (b + 1) - 1
   = (1+a) * (1 + b) - 1

Ahora toma tres números a, b, c:- 

   = a + b + c + ab + bc + ca + abc 
   = a + ac + b + bc + ab + abc + c + 1 - 1
   = a(1+c) + b(1+c) + ab(1+c) + c + 1 - 1
   = (a + b + ab + 1)(1+c) - 1 
   = (1+a) * (1+b) * (1+c) - 1  

El patrón anterior se puede generalizar para n números.

A continuación se muestra la implementación de la idea anterior: 

C++

// C++ program to find sum of product of
// all subsets.
#include <bits/stdc++.h>
using namespace std;
 
// Returns sum of products of all subsets
// of arr[0..n-1]
int productOfSubsetSums(int arr[], int n)
{
    int ans = 1;
    for (int i = 0; i < n; ++i )
        ans = ans * (arr[i] + 1);
    return ans-1;
}
 
// Driver code
int main()
{
    int arr[] = {1, 2, 3, 4};
    int n = sizeof(arr)/sizeof arr[0];
    cout << productOfSubsetSums(arr, n);
    return 0;
}

Java

// Java program to find sum of product of
// all subsets.
 
public class Subset
{
    // Returns sum of products of all subsets
    // of arr[0..n-1]
    static int productOfSubsetSums(int arr[], int n)
    {
        int ans = 1;
        for (int i = 0; i < n; ++i )
            ans = ans * (arr[i] + 1);
        return ans-1;
    }
     
    public static void main (String[] args)
    {
        int arr[] = {1, 2, 3, 4};
        int n = arr.length;
        System.out.println(productOfSubsetSums(arr, n));
    }
}
 
// This code is contributed by Saket Kumar

Python3

# Python3 program to
# find sum of product of
# all subsets.
 
# Returns sum of products
# of all subsets
# of arr[0..n-1]
def productOfSubsetSums(arr, n):
    ans = 1;
    for i in range(0,n):
        ans = ans * (arr[i] + 1)
    return ans-1
 
# Driver code
arr = [1, 2, 3, 4]
n = len(arr)
 
print (productOfSubsetSums(arr, n))
     
# This code is contributed
# by Shreyanshi Arun.

C#

// C# program to find sum of
// product of all subsets.
using System;
 
public class Subset
{
     
    // Returns sum of products of all
    // subsets of arr[0..n-1]
    static int productOfSubsetSums(int []arr, int n)
    {
        int ans = 1;
        for (int i = 0; i < n; ++i )
            ans = ans * (arr[i] + 1);
        return ans-1;
    }
     
    // Driver Code
    public static void Main ()
    {
        int []arr = {1, 2, 3, 4};
        int n = arr.Length;
        Console.Write(productOfSubsetSums(arr, n));
    }
}
 
// This code is contributed by Nitin Mittal.

PHP

<?php
// PHP program to find sum of
// product of all subsets.
 
// Returns sum of products of
// all subsets of arr[0..n-1]
function productOfSubsetSums($arr, $n)
{
    $ans = 1;
    for ($i = 0; $i < $n; ++$i )
        $ans = $ans * ($arr[$i] + 1);
    return $ans-1;
}
 
// Driver code
$arr = array(1, 2, 3, 4);
$n = sizeof($arr);
echo(productOfSubsetSums($arr, $n));
 
// This code is contributed by Ajit.
?>

Javascript

<script>
 
// Javascript program to find sum of product of
// all subsets.
 
// Returns sum of products of all subsets
// of arr[0..n-1]
function productOfSubsetSums(arr, n)
{
    let ans = 1;
    for (let i = 0; i < n; ++i )
        ans = ans * (arr[i] + 1);
    return ans-1;
}
 
// Driver code
 
    let arr = [1, 2, 3, 4];
    let n = arr.length;
    document.write(productOfSubsetSums(arr, n));
 
 
// This code is contributed by Mayank Tyagi
 
</script>
Producción

119

Complejidad temporal: O(n) 
Espacio auxiliar: O(1)

Este artículo es una contribución de Shubham Bansal . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. 

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 *