Suma de subconjuntos de todos los subconjuntos de una array | O(3^N)

Dada una array arr[] de longitud N , la tarea es encontrar la suma total de los subconjuntos de todos los subconjuntos de la array.
Ejemplos: 
 

Entrada: arr[] = {1, 1} 
Salida:
Todos los subconjuntos posibles: 
a) {} : 0 
Todos los subconjuntos posibles de este subconjunto 
serán {}, Sum = 0 
b) {1} : 1 
Todos los subconjuntos posibles de este subconjunto 
serán {} y {1}, Sum = 0 + 1 = 1 
c) {1} : 1 
Todos los posibles subconjuntos de este subconjunto 
serán {} y {1}, Sum = 0 + 1 = 1 
d ) {1, 1} : 4 
Todos los subconjuntos posibles de este subconjunto 
serán {}, {1}, {1} y {1, 1}, Suma = 0 + 1 + 1 + 2 = 4 
Así, ans = 0 + 1 + 1 + 4 = 6
Entrada: arr[] = {1, 4, 2, 12} 
Salida: 513 
 

Enfoque: En este artículo, se discutirá  un enfoque con complejidad de tiempo O(3 N ) para resolver el problema dado.
Primero, genere todos los subconjuntos posibles de la array. Habrá 2 N subconjuntos en total. Luego, para cada subconjunto, encuentre la suma de todos sus subconjuntos. 
Ahora, comprendamos la complejidad temporal de esta solución. 
Hay N C k subconjuntos de longitud K y el tiempo para encontrar los subconjuntos de una array de longitud K es 2 K
Tiempo total = ( NC 1 * 2 1 ) + ( NC2 * 2 2 ) + … + ( N C k * K ) = 3 K
A continuación se muestra la implementación del enfoque anterior: 
 

C++

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to sum of all subsets of a
// given array
void subsetSum(vector<int>& c, int i,
               int& ans, int curr)
{
    // Base case
    if (i == c.size()) {
        ans += curr;
        return;
    }
 
    // Recursively calling subsetSum
    subsetSum(c, i + 1, ans, curr + c[i]);
    subsetSum(c, i + 1, ans, curr);
}
 
// Function to generate the subsets
void subsetGen(int* arr, int i, int n,
               int& ans, vector<int>& c)
{
    // Base-case
    if (i == n) {
 
        // Finding the sum of all the subsets
        // of the generated subset
        subsetSum(c, 0, ans, 0);
        return;
    }
 
    // Recursively accepting and rejecting
    // the current number
    subsetGen(arr, i + 1, n, ans, c);
    c.push_back(arr[i]);
    subsetGen(arr, i + 1, n, ans, c);
    c.pop_back();
}
 
// Driver code
int main()
{
    int arr[] = { 1, 1 };
    int n = sizeof(arr) / sizeof(int);
 
    // To store the final ans
    int ans = 0;
    vector<int> c;
 
    subsetGen(arr, 0, n, ans, c);
    cout << ans;
 
    return 0;
}

Java

// Java implementation of the approach
import java.util.*;
 
class GFG
{
    static Vector<Integer> c = new Vector<>();
 
    // To store the final ans
    static int ans = 0;
 
    // Function to sum of all subsets of a
    // given array
    static void subsetSum(int i, int curr)
    {
 
        // Base case
        if (i == c.size())
        {
            ans += curr;
            return;
        }
 
        // Recursively calling subsetSum
        subsetSum(i + 1, curr + c.elementAt(i));
        subsetSum(i + 1, curr);
    }
 
    // Function to generate the subsets
    static void subsetGen(int[] arr, int i, int n)
    {
 
        // Base-case
        if (i == n)
        {
 
            // Finding the sum of all the subsets
            // of the generated subset
            subsetSum(0, 0);
            return;
        }
 
        // Recursively accepting and rejecting
        // the current number
        subsetGen(arr, i + 1, n);
        c.add(arr[i]);
        subsetGen(arr, i + 1, n);
        c.remove(c.size() - 1);
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        int[] arr = { 1, 1 };
        int n = arr.length;
 
        subsetGen(arr, 0, n);
        System.out.println(ans);
    }
}
 
// This code is contributed by
// sanjeev2552

Python3

# Python3 implementation of the approach
 
# Function to sum of all subsets
# of a given array
c = []
ans = 0
 
def subsetSum(i, curr):
    global ans, c
     
    # Base case
    if (i == len(c)):
        ans += curr
        return
 
    # Recursively calling subsetSum
    subsetSum(i + 1, curr + c[i])
    subsetSum(i + 1, curr)
 
# Function to generate the subsets
def subsetGen(arr, i, n):
    global ans, c
     
    # Base-case
    if (i == n):
 
        # Finding the sum of all the subsets
        # of the generated subset
        subsetSum(0, 0)
        return
 
    # Recursively accepting and rejecting
    # the current number
    subsetGen(arr, i + 1, n)
    c.append(arr[i])
    subsetGen(arr, i + 1, n)
    del c[-1]
 
# Driver code
arr = [1, 1]
n = len(arr)
 
subsetGen(arr, 0, n)
 
print(ans)
 
# This code is contributed by Mohit Kumar

C#

// C# implementation of the approach
using System;
using System.Collections.Generic;
 
class GFG
{
    static List<int> c = new List<int>();
 
    // To store the readonly ans
    static int ans = 0;
 
    // Function to sum of all subsets of a
    // given array
    static void subsetSum(int i, int curr)
    {
 
        // Base case
        if (i == c.Count)
        {
            ans += curr;
            return;
        }
 
        // Recursively calling subsetSum
        subsetSum(i + 1, curr + c[i]);
        subsetSum(i + 1, curr);
    }
 
    // Function to generate the subsets
    static void subsetGen(int[] arr, int i, int n)
    {
 
        // Base-case
        if (i == n)
        {
 
            // Finding the sum of all the subsets
            // of the generated subset
            subsetSum(0, 0);
            return;
        }
 
        // Recursively accepting and rejecting
        // the current number
        subsetGen(arr, i + 1, n);
        c.Add(arr[i]);
        subsetGen(arr, i + 1, n);
        c.RemoveAt(c.Count - 1);
    }
 
    // Driver Code
    public static void Main(String[] args)
    {
        int[] arr = { 1, 1 };
        int n = arr.Length;
 
        subsetGen(arr, 0, n);
        Console.WriteLine(ans);
    }
}
 
// This code is contributed by Rajput-Ji

Javascript

<script>
 
// Javascript implementation of the approach
 
var ans = 0;
 
var c = [];
 
// Function to sum of all subsets of a
// given array
function subsetSum(i, curr)
{
    // Base case
    if (i == c.length) {
        ans += curr;
        return;
    }
 
    // Recursively calling subsetSum
    subsetSum( i + 1, curr + c[i]);
    subsetSum(i + 1, curr);
}
 
// Function to generate the subsets
function subsetGen(arr, i, n, ans)
{
    // Base-case
    if (i == n) {
 
        // Finding the sum of all the subsets
        // of the generated subset
        subsetSum(0, ans, 0);
        return;
    }
 
    // Recursively accepting and rejecting
    // the current number
    subsetGen(arr, i + 1, n, ans);
    c.push(arr[i]);
    subsetGen(arr, i + 1, n, ans);
    c.pop();
}
 
// Driver code
var arr = [1, 1 ];
var n = arr.length;
// To store the final ans
var ans = 0;
var c = [];
subsetGen(arr, 0, n, ans);
document.write( ans);
 
</script>
Producción: 

6

 

Complejidad de tiempo: O(n * 2 n ), para generar todos los subconjuntos donde n es el tamaño de la array dada
Espacio auxiliar: O(n), para almacenar la respuesta final

Publicación traducida automáticamente

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