Minimice la diferencia de suma de subconjuntos después de eliminar K elementos de Array

Dada una array arr[] que contiene N enteros y un entero K , la tarea es minimizar la diferencia de la suma del subconjunto después de eliminar K elementos de la array dada.

Nota: Los subconjuntos no deben estar vacíos.

Ejemplos:

Entrada: arr[] = {7, 9, 5, 8, 1, 3}, K = 2
Salida : -23
Explicación : elimine 5 y 3 de la array y forme subconjuntos [1] y [7, 8, 9] . 
La diferencia de subconjunto de estos subconjuntos es 1 – 24 = -23 que es la diferencia mínima posible.

Entrada: arr[] = {7, 9, 5, 8}, K = 3
Salida: -1
Explicación: Si se eliminan 3 elementos, no es posible formar dos subconjuntos no vacíos.

 

Enfoque: El problema se puede resolver usando la recursividad basada en la siguiente idea:

Para cada elemento de la array hay 3 opciones : se puede eliminar o ser parte de cualquiera de los dos subconjuntos. Forme todos los subconjuntos posibles después de eliminar K elementos y encuentre aquel en el que la diferencia de las sumas de los subconjuntos sea la mínima.

En lugar de considerar las tres opciones para cada elemento de la array, solo se pueden considerar dos opciones: eliminar o formar parte del primer subconjunto (porque si se conoce la suma de los elementos del primer subconjunto, entonces la suma del otro subconjunto = suma de la array – suma del primer subconjunto)

Siga los pasos mencionados para resolver el problema:

  • Calcular la suma de todos los elementos de la array .
  • Iterar recursivamente para cada elemento de la array:
    • Elimine esto si los elementos K aún no se han eliminado y continúe con el siguiente índice.
    • Considere esto como parte de un subconjunto.
    • Si se recorre todo el arreglo, verifique la diferencia entre las sumas de dos subconjuntos.
  • La diferencia mínima es la respuesta requerida.

A continuación se muestra la implementación del enfoque mencionado anteriormente:

C++

// C++ code to implement the above approach
#include <bits/stdc++.h>
using namespace std;
 
int mini = INT_MAX;
 
// Function to form all possible subsets
void subset(vector<int> arr, int index, int sum, int total)
{
    if (index >= arr.size()) {
        if (sum != 0)
            mini = min(mini, sum - (total - sum));
        return;
    }
    subset(arr, index + 1, sum + arr[index], total);
    subset(arr, index + 1, sum, total);
}
 
// Function to get the minimum difference
static void print(int index, vector<int>& arr, int total,
                  vector<int>& ans)
{
    if (total == 0) {
        int sum = 0;
        for (int elements : ans) {
            sum += elements;
        }
 
        // Function call to form subset
        subset(ans, 0, 0, sum);
        return;
    }
    if (index >= arr.size()) {
        return;
    }
    ans.push_back(arr[index]);
    print(index + 1, arr, total - 1, ans);
    ans.pop_back();
    print(index + 1, arr, total, ans);
}
 
// Utility function to solve the problem
void solve(vector<int>& arr, int N)
{
    int selected = arr.size() - N;
 
    if (selected <= 1) {
        cout << -1;
        return;
    }
    vector<int> ans;
    print(0, arr, selected, ans);
}
 
// Driver code
int main()
{
    vector<int> arr = { 7, 9, 5, 8, 1, 3 };
    int N = 2;
    solve(arr, N);
    cout << (mini);
    return 0;
}
 
// This code is contributed by rakeshsahni

Java

// Java code to implement the above approach
 
import java.io.*;
import java.util.*;
 
class GFG {
 
    static int min = Integer.MAX_VALUE;
 
    // Function to form all possible subsets
    static void subset(List<Integer> arr,
                       int index,
                       int sum, int total)
    {
        if (index >= arr.size()) {
            if (sum != 0)
                min = Math.min(min,
                               sum - (total - sum));
            return;
        }
        subset(arr, index + 1,
               sum + arr.get(index), total);
        subset(arr, index + 1, sum, total);
    }
 
    // Function to get the minimum difference
    static void print(int index, int arr[],
                      int total,
                      List<Integer> ans)
    {
        if (total == 0) {
            int sum = 0;
            for (int elements : ans) {
                sum += elements;
            }
 
            // Function call to form subset
            subset(ans, 0, 0, sum);
            return;
        }
        if (index >= arr.length) {
            return;
        }
        ans.add(arr[index]);
        print(index + 1, arr, total - 1, ans);
        ans.remove(ans.size() - 1);
        print(index + 1, arr, total, ans);
    }
 
    // Utility function to solve the problem
    public static void solve(int arr[], int N)
    {
        int selected = arr.length - N;
 
        if (selected <= 1) {
            System.out.println(-1);
            return;
        }
        List<Integer> ans = new ArrayList<>();
        print(0, arr, selected, ans);
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int arr[] = { 7, 9, 5, 8, 1, 3 };
        int N = 2;
 
        solve(arr, N);
        System.out.println(min);
    }
}

Python3

# Python code to implement the above approach
import sys
 
# Function to form all possible subsets
def subset(arr,index,sum,total):
    global mini
 
    if (index >= len(arr)):
        if (sum != 0):
            mini = min(mini, sum - (total - sum))
        return
 
    subset(arr, index + 1, sum + arr[index], total)
    subset(arr, index + 1, sum, total)
 
# Function to get the minimum difference
def Print(index,arr,total,ans):
 
    if (total == 0):
        sum = 0
        for elements in ans:
            sum += elements
 
        # Function call to form subset
        subset(ans, 0, 0, sum)
        return
 
    if (index >= len(arr)):
        return
 
    ans.append(arr[index])
    Print(index + 1, arr, total - 1, ans)
    ans.pop()
    Print(index + 1, arr, total, ans)
 
# Utility function to solve the problem
def solve(arr,N):
 
    selected = len(arr) - N
 
    if (selected <= 1):
        print(-1)
        return
 
    ans = []
    Print(0, arr, selected, ans)
 
# Driver code
 
if __name__=="__main__":
 
    mini = sys.maxsize
    arr = [ 7, 9, 5, 8, 1, 3 ]
    N = 2
    solve(arr, N)
    print(mini)
     
# This code is contributed by shinjanpatra

C#

// C# program to implement
// the above approach
using System;
using System.Collections.Generic;
 
class GFG
{
 
  static int min = Int32.MaxValue;
 
  // Function to form all possible subsets
  static void subset(List<int> arr,
                     int index,
                     int sum, int total)
  {
    if (index >= arr.Count) {
      if (sum != 0)
        min = Math.Min(min,
                       sum - (total - sum));
      return;
    }
    subset(arr, index + 1,
           sum + arr[index], total);
    subset(arr, index + 1, sum, total);
  }
 
  // Function to get the minimum difference
  static void print(int index, int[] arr,
                    int total,
                    List<int> ans)
  {
    if (total == 0) {
      int sum = 0;
      foreach (int elements in ans) {
        sum += elements;
      }
 
      // Function call to form subset
      subset(ans, 0, 0, sum);
      return;
    }
    if (index >= arr.Length) {
      return;
    }
    ans.Add(arr[index]);
    print(index + 1, arr, total - 1, ans);
    ans.RemoveAt(ans.Count - 1);
    print(index + 1, arr, total, ans);
  }
 
  // Utility function to solve the problem
  public static void solve(int[] arr, int N)
  {
    int selected = arr.Length - N;
 
    if (selected <= 1) {
      Console.Write(-1);
      return;
    }
    List<int> ans = new List<int>();
    print(0, arr, selected, ans);
  }
 
  // Driver Code
  public static void Main()
  {
    int[] arr = { 7, 9, 5, 8, 1, 3 };
    int N = 2;
 
    solve(arr, N);
    Console.Write(min);
  }
}
 
// This code is contributed by sanjoy_62.

Javascript

<script>
 
 // JavaScript code to implement the above approach
let mini = Number.MAX_VALUE;
 
// Function to form all possible subsets
function subset(arr,index,sum,total)
{
    if (index >= arr.length) {
        if (sum != 0)
            mini = Math.min(mini, sum - (total - sum));
        return;
    }
    subset(arr, index + 1, sum + arr[index], total);
    subset(arr, index + 1, sum, total);
}
 
// Function to get the minimum difference
function print(index,arr,total,ans)
{
    if (total == 0) {
        sum = 0;
        for (let elements of ans) {
            sum += elements;
        }
 
        // Function call to form subset
        subset(ans, 0, 0, sum);
        return;
    }
    if (index >= arr.length) {
        return;
    }
    ans.push(arr[index]);
    print(index + 1, arr, total - 1, ans);
    ans.pop();
    print(index + 1, arr, total, ans);
}
 
// Utility function to solve the problem
function solve(arr,N)
{
    let selected = arr.length - N;
 
    if (selected <= 1) {
        document.write(-1);
        return;
    }
    let ans = [];
    print(0, arr, selected, ans);
}
 
// Driver code
 
let arr = [ 7, 9, 5, 8, 1, 3 ];
let N = 2;
solve(arr, N);
document.write(mini);
 
// This code is contributed by shinjanpatra
 
</script>
Producción

-23

Complejidad temporal: O(2 N )
Espacio auxiliar: O(N)

Publicación traducida automáticamente

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