Subsecuencias únicas de longitud K con suma dada

Dada una array arr[] de N enteros y dos números K y S , la tarea es imprimir toda la subsecuencia de longitud K con la suma S .
Ejemplos: 
 

Entrada: N = 5, K = 3, S = 20, arr[] = {4, 6, 8, 2, 12} 
Salida: 
{6, 2, 12} 
Explicación: 
Solo una subsecuencia de tamaño 3 con suma 20 es posible, es decir, {6, 2, 12} y la suma es 6 + 2 + 12 = 20
Entrada: N = 10, K = 5, S = 25, arr[] = {2, 4, 6, 8, 10, 12, 1, 2, 5, 7} 
Salida: 
{10, 1, 2, 5, 7} 
{4, 8, 1, 5, 7} 
{4, 8, 10, 1, 2} 
{4, 6, 12, 1, 2} 
{4, 6, 8, 2, 5} 
{2, 10, 1, 5, 7} 
{2, 8, 12, 1, 2} 
{2, 6, 10, 2, 5} 
{2, 6, 8, 2, 7} 
{2, 4, 12, 2, 5} 
{2, 4, 10, 2, 7} 
{2, 4, 8, 10, 1} 
{2, 4, 6 , 12, 1} 
{2, 4, 6, 8, 5} 
 

Enfoque: La idea es usar Backtracking para imprimir toda la subsecuencia con la suma S dada . A continuación se muestran los pasos: 
 

  • Iterar por todo el valor de la array arr[] y hacer lo siguiente: 
    1. Si incluimos el elemento actual en la subsecuencia resultante, entonces, disminuya K y el valor anterior del elemento actual a la suma S.
    2. Itere recursivamente desde el siguiente índice del elemento hasta el final de la array para encontrar la subsecuencia resultante.
    3. Si K es 0 y S es 0 , entonces obtuvimos nuestra subsecuencia resultante de longitud K y suma S , imprimimos esta subsecuencia y retrocedemos para la siguiente subsecuencia resultante.
    4. Si no incluimos el elemento actual, encuentre la subsecuencia resultante excluyendo el elemento actual y repitiendo el procedimiento anterior para el resto del elemento en la array.
  • La array resultante en los pasos 3 dará todas las subsecuencias posibles de longitud K con la suma S dada .

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 all the subsequences
// of a given length and having sum S
void comb(int* arr, int len, int r,
          int ipos, int* op, int opos,
          int sum)
{
 
    // Termination condition
    if (opos == r) {
 
        int sum2 = 0;
        for (int i = 0; i < opos; i++) {
 
            // Add value to sum
            sum2 = sum2 + op[i];
        }
 
        // Check if the resultant sum
        // equals to target sum
        if (sum == sum2) {
 
            // If true
            for (int i = 0; i < opos; i++)
 
                // Print resultant array
                cout << op[i] << ", ";
 
            cout << endl;
        }
 
        // End this recursion stack
        return;
    }
    if (ipos < len) {
 
        // Check all the combinations
        // using backtracking
        comb(arr, len, r, ipos + 1,
             op, opos, sum);
 
        op[opos] = arr[ipos];
 
        // Check all the combinations
        // using backtracking
        comb(arr, len, r, ipos + 1,
             op, opos + 1, sum);
    }
}
 
// Driver Code
int main()
{
    // Given array
    int arr[] = { 4, 6, 8, 2, 12 };
    int K = 3;
    int S = 20;
 
    int N = sizeof(arr) / sizeof(arr[0]);
 
    // To store the subsequence
    int op[N] = { 0 };
 
    // Function Call
    comb(arr, N, K, 0, op, 0, S);
    return 0;
}

Java

// Java program for the above approach
import java.util.*;
 
class GFG{
 
// Function to find all the subsequences
// of a given length and having sum S
static void comb(int []arr, int len, int r,
                 int ipos, int[] op, int opos,
                 int sum)
{
 
    // Termination condition
    if (opos == r)
    {
        int sum2 = 0;
        for(int i = 0; i < opos; i++)
        {
             
           // Add value to sum
           sum2 = sum2 + op[i];
        }
 
        // Check if the resultant sum
        // equals to target sum
        if (sum == sum2)
        {
 
            // If true
            for(int i = 0; i < opos; i++)
                
               // Print resultant array
               System.out.print(op[i] + ", ");
 
            System.out.println();
        }
 
        // End this recursion stack
        return;
    }
    if (ipos < len)
    {
 
        // Check all the combinations
        // using backtracking
        comb(arr, len, r, ipos + 1,
             op, opos, sum);
              
        op[opos] = arr[ipos];
 
        // Check all the combinations
        // using backtracking
        comb(arr, len, r, ipos + 1,
             op, opos + 1, sum);
    }
}
 
// Driver Code
public static void main(String[] args)
{
     
    // Given array
    int arr[] = { 4, 6, 8, 2, 12 };
    int K = 3;
    int S = 20;
 
    int N = arr.length;
 
    // To store the subsequence
    int op[] = new int[N];
 
    // Function Call
    comb(arr, N, K, 0, op, 0, S);
}
}
 
// This code is contributed by amal kumar choubey

Python3

# Python3 program for the above approach
 
# Function to find all the subsequences
# of a given length and having sum S
def comb(arr, Len, r, ipos, op, opos, Sum):
 
    # Termination condition
    if (opos == r):
 
        sum2 = 0
        for i in range(opos):
 
            # Add value to sum
            sum2 = sum2 + op[i]
 
        # Check if the resultant sum
        # equals to target sum
        if (Sum == sum2):
 
            # If true
            for i in range(opos):
 
                # Print resultant array
                print(op[i], end = ", ")
 
            print()
 
        # End this recursion stack
        return
 
    if (ipos < Len):
 
        # Check all the combinations
        # using backtracking
        comb(arr, Len, r, ipos + 1,
             op, opos, Sum)
 
        op[opos] = arr[ipos]
 
        # Check all the combinations
        # using backtracking
        comb(arr, Len, r, ipos + 1, op,
                          opos + 1, Sum)
 
# Driver code
if __name__ == '__main__':
 
    # Given array
    arr = [ 4, 6, 8, 2, 12 ]
    K = 3
    S = 20
    N = len(arr)
 
    # To store the subsequence
    op = [0] * N
 
    # Function call
    comb(arr, N, K, 0, op, 0, S)
 
# This code is contributed by himanshu77

C#

// C# program for the above approach
using System;
 
class GFG{
 
// Function to find all the subsequences
// of a given length and having sum S
static void comb(int []arr, int len, int r,
                 int ipos, int[] op, int opos,
                 int sum)
{
 
    // Termination condition
    if (opos == r)
    {
        int sum2 = 0;
        for(int i = 0; i < opos; i++)
        {
            
           // Add value to sum
           sum2 = sum2 + op[i];
        }
 
        // Check if the resultant sum
        // equals to target sum
        if (sum == sum2)
        {
 
            // If true
            for(int i = 0; i < opos; i++)
                
               // Print resultant array
               Console.Write(op[i] + ", ");
            Console.WriteLine();
        }
 
        // End this recursion stack
        return;
    }
    if (ipos < len)
    {
 
        // Check all the combinations
        // using backtracking
        comb(arr, len, r, ipos + 1,
             op, opos, sum);
             
        op[opos] = arr[ipos];
 
        // Check all the combinations
        // using backtracking
        comb(arr, len, r, ipos + 1,
             op, opos + 1, sum);
    }
}
 
// Driver Code
public static void Main(String[] args)
{
     
    // Given array
    int []arr = { 4, 6, 8, 2, 12 };
    int K = 3;
    int S = 20;
 
    int N = arr.Length;
 
    // To store the subsequence
    int []op = new int[N];
 
    // Function call
    comb(arr, N, K, 0, op, 0, S);
}
}
 
// This code is contributed by amal kumar choubey

Javascript

<script>
 
// JavaScript program for the above approach
 
// Function to find all the subsequences
// of a given length and having sum S
function comb(arr, len, r,
                 ipos, op, opos,
                 sum)
{
 
    // Termination condition
    if (opos == r)
    {
        let sum2 = 0;
        for(let i = 0; i < opos; i++)
        {
             
           // Add value to sum
           sum2 = sum2 + op[i];
        }
 
        // Check if the resultant sum
        // equals to target sum
        if (sum == sum2)
        {
 
            // If true
            for(let i = 0; i < opos; i++)
                
               // Print resultant array
               document.write(op[i] + ", ");
 
            document.write();
        }
 
        // End this recursion stack
        return;
    }
    if (ipos < len)
    {
 
        // Check all the combinations
        // using backtracking
        comb(arr, len, r, ipos + 1,
             op, opos, sum);
              
        op[opos] = arr[ipos];
 
        // Check all the combinations
        // using backtracking
        comb(arr, len, r, ipos + 1,
             op, opos + 1, sum);
    }
}
  
// Driver Code
 
    // Given array
    let arr = [ 4, 6, 8, 2, 12 ];
    let K = 3;
    let S = 20;
 
    let N = arr.length;
 
    // To store the subsequence
    let op = Array.from({length: N}, (_, i) => 0);
 
    // Function Call
    comb(arr, N, K, 0, op, 0, S);
 
// This code is contributed by sanjoy_62.
</script>

Producción: 
 

6, 2, 12, 

Complejidad de tiempo: O(2^N * K)  
Espacio auxiliar : O(N)

Publicación traducida automáticamente

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