Recuento de todas las combinaciones posibles de K números que suman N

Dado un número N , la tarea es contar las combinaciones de K números del 1 al N que tienen una suma igual a N , con duplicados permitidos.

Ejemplo:

Entrada: N = 7, K = 3
Salida: 15
Explicación: Las combinaciones que conducen a la suma N = 7 son: {1, 1, 5}, {1, 5, 1}, {5, 1, 1}, {2, 1, 4}, {1, 2, 4}, {1, 4, 2}, {2, 4, 1}, {4, 1, 2}, {4, 2, 1}, {3 , 1, 3}, {1, 3, 3}, {3, 3, 1}, {2, 2, 3}, {2, 3, 2}, {3, 2, 2}

Entrada: N = 5, K = 5
Salida: 1
Explicación: {1, 1, 1, 1, 1} es la única combinación.

 

Enfoque ingenuo: este problema se puede resolver utilizando la recursividad y luego memorizando el resultado para mejorar la complejidad del tiempo. Para resolver este problema, siga los siguientes pasos:

  1. Cree una función, digamos countWaysUtil , que aceptará cuatro parámetros que son N , K , sum y dp . Aquí N es la suma que se requiere que tengan K elementos, K es el número de elementos consumidos, sum es la suma acumulada hasta ahora y dp es la array para memorizar el resultado. Esta función le dará la cantidad de formas de obtener la suma en K números.
  2. Ahora llame inicialmente a countWaysUtil con los argumentos N , K , sum=0 y dp como una array llena con todo -1 .
  3. En cada llamada recursiva:
    • Verifique los casos base:
      • Si la suma es igual a N y K se convierte en 0, entonces devuelve 1.
      • Si la suma supera a N y K sigue siendo mayor que 0, devuelva 0.
    • Ahora, ejecute un bucle for de 1 a N para verificar el resultado de cada resultado.
    • Sume todos los resultados en una variable cnt y devuelva cnt después de memorizarlos.
  4. Escriba la respuesta de acuerdo con la observación anterior.

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 count
// all the possible combinations
// of K numbers having sum equals to N
int countWaysUtil(int N, int K, int sum,
                  vector<vector<int> >& dp)
{
 
    // Base Cases
    if (sum == N and K == 0) {
        return 1;
    }
 
    if (sum >= N and K >= 0) {
        return 0;
    }
 
    if (K < 0) {
        return 0;
    }
 
    // If the result is already memoised
    if (dp[sum][K] != -1) {
        return dp[sum][K];
    }
 
    // Recursive Calls
    int cnt = 0;
    for (int i = 1; i <= N; i++) {
        cnt += countWaysUtil(
            N, K - 1,
            sum + i, dp);
    }
 
    // Returning answer
    return dp[sum][K] = cnt;
}
 
void countWays(int N, int K)
{
    vector<vector<int> > dp(N + 1,
                            vector<int>(
                                K + 1, -1));
    cout << countWaysUtil(N, K, 0, dp);
}
 
// Driver Code
int main()
{
    int N = 7, K = 3;
    countWays(N, K);
}

Java

// Java implementation for the above approach
class GFG {
 
    // Function to count
    // all the possible combinations
    // of K numbers having sum equals to N
    static int countWaysUtil(int N, int K, int sum,
                             int[][] dp)
    {
 
        // Base Cases
        if (sum == N && K == 0) {
            return 1;
        }
 
        if (sum >= N && K >= 0) {
            return 0;
        }
 
        if (K < 0) {
            return 0;
        }
 
        // If the result is already memoised
        if (dp[sum][K] != -1) {
            return dp[sum][K];
        }
 
        // Recursive Calls
        int cnt = 0;
        for (int i = 1; i <= N; i++) {
            cnt += countWaysUtil(N, K - 1, sum + i, dp);
        }
 
        // Returning answer
        return dp[sum][K] = cnt;
    }
 
    static void countWays(int N, int K)
    {
        int[][] dp = new int[N + 1][K + 1];
        for (int i = 0; i < N + 1; i++) {
            for (int j = 0; j < K + 1; j++) {
 
                dp[i][j] = -1;
            }
        }
        System.out.print(countWaysUtil(N, K, 0, dp));
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        int N = 7, K = 3;
        countWays(N, K);
    }
}
 
// This code is contributed by ukasp.

Python3

# Python3 program for the above approach
 
# Function to count all the possible
# combinations of K numbers having
# sum equals to N
def countWaysUtil(N, K, sum, dp):
 
    # Base Cases
    if (sum == N and K == 0):
        return 1
 
    if (sum >= N and K >= 0):
        return 0
 
    if (K < 0):
        return 0
 
    # If the result is already memoised
    if (dp[sum][K] != -1):
        return dp[sum][K]
 
    # Recursive Calls
    cnt = 0
    for i in range(1, N+1):
        cnt += countWaysUtil(N, K - 1, sum + i, dp)
 
    # Returning answer
    dp[sum][K] = cnt
    return dp[sum][K]
 
def countWays(N, K):
     
    dp = [[-1 for _ in range(K + 1)]
              for _ in range(N + 1)]
    print(countWaysUtil(N, K, 0, dp))
 
# Driver Code
if __name__ == "__main__":
 
    N = 7
    K = 3
     
    countWays(N, K)
 
# This code is contributed by rakeshsahni

C#

// C# implementation for the above approach
using System;
class GFG
{
     
// Function to count
// all the possible combinations
// of K numbers having sum equals to N
static int countWaysUtil(int N, int K, int sum,
                  int [,]dp)
{
 
    // Base Cases
    if (sum == N && K == 0) {
        return 1;
    }
 
    if (sum >= N && K >= 0) {
        return 0;
    }
 
    if (K < 0) {
        return 0;
    }
 
    // If the result is already memoised
    if (dp[sum, K] != -1) {
        return dp[sum, K];
    }
 
    // Recursive Calls
    int cnt = 0;
    for (int i = 1; i <= N; i++) {
        cnt += countWaysUtil(
            N, K - 1,
            sum + i, dp);
    }
 
    // Returning answer
    return dp[sum, K] = cnt;
}
 
static void countWays(int N, int K)
{
    int [,]dp = new int[N + 1, K + 1];
    for(int i = 0; i < N + 1; i++) {
        for(int j = 0; j < K + 1; j++) {
             
            dp[i, j] = -1;
        }
    }
    Console.Write(countWaysUtil(N, K, 0, dp));
}
 
// Driver Code
public static void Main()
{
    int N = 7, K = 3;
    countWays(N, K);
}
}
 
// This code is contributed by Samim Hossain Mondal.

Javascript

<script>
// Javascript program for the above approach
 
// Function to count
// all the possible combinations
// of K numbers having sum equals to N
function countWaysUtil(N, K, sum, dp) {
 
    // Base Cases
    if (sum == N && K == 0) {
        return 1;
    }
 
    if (sum >= N && K >= 0) {
        return 0;
    }
 
    if (K < 0) {
        return 0;
    }
 
    // If the result is already memoised
    if (dp[sum][K] != -1) {
        return dp[sum][K];
    }
 
    // Recursive Calls
    let cnt = 0;
    for (let i = 1; i <= N; i++) {
        cnt += countWaysUtil(
            N, K - 1,
            sum + i, dp);
    }
 
    // Returning answer
    return dp[sum][K] = cnt;
}
 
function countWays(N, K) {
    let dp = new Array(N + 1).fill(0).map(() => new Array(K + 1).fill(-1))
    document.write(countWaysUtil(N, K, 0, dp));
}
 
// Driver Code
let N = 7, K = 3;
countWays(N, K);
 
// This code is contributed by saurabh_jaiswal.
</script>
Producción

15

Complejidad de tiempo: O(N*K)
Complejidad de espacio: O(N*K)

Enfoque eficiente:  este problema también se puede resolver utilizando el teorema del binomio . Como la suma requerida es N con K elementos, supongamos que los K números son:

a1 + a2 + a3 + a4 + …….. + aK = N
De acuerdo con el principio estándar de partición en el teorema del binomio, la ecuación anterior tiene una solución que es  N+K-1 C K-1 , donde K>= 0 _ Pero en nuestro caso, K>=1 . Por lo tanto, N debe sustituirse por NK y la ecuación se convierte en  N-1 C K-1

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program for the above approach
#include <iostream>
using namespace std;
 
// Method to find factorial of given number
int factorial(int n)
{
    if (n == 0)
        return 1;
         
    return n * factorial(n - 1);
}
 
// Function to count all the possible
// combinations of K numbers having
// sum equals to N
int totalWays(int N, int K)
{
     
    // If N<K
    if (N < K)
        return 0;
     
    // Storing numerator
    int  n1 = factorial(N - 1);
     
    // Storing denominator
    int n2 = factorial(K - 1) * factorial(N - K);
    int ans = (n1 / n2);
     
    // Returning answer
    return ans;
}
 
// Driver code
int main()
{
    int N = 7;
    int K = 3;
    int ans = totalWays(N, K);
     
    cout << ans;
     
    return 0;
}
 
// This code is contributed by Shubham Singh

C

// C Program for the above approach
#include <stdio.h>
 
 // method to find factorial of given number
 int factorial(int n)
 {
    if (n == 0)
      return 1;
 
    return n*factorial(n - 1);
 }
 
 // Function to count
 // all the possible combinations
 // of K numbers having sum equals to N
 int totalWays(int N, int K) {
 
    // If N<K
    if (N < K)
      return 0;
 
    // Storing numerator
    int  n1 = factorial(N - 1);
 
    // Storing denominator
    int n2 = factorial(K - 1)*factorial(N - K);
    int ans = (n1/n2);
 
    // Returning answer
    return ans;
 }
 
  // Driver method
  int main()
  {
 
    int N = 7;
    int K = 3;
    int ans = totalWays(N, K);
    printf("%d",ans);
    return 0;
  }
   
// This code is contributed by Shubham Singh

Java

// Java Program for the above approach
class Solution{
 
  // method to find factorial of given number
  static int factorial(int n)
  {
    if (n == 0)
      return 1;
 
    return n*factorial(n - 1);
  }
 
  // Function to count
  // all the possible combinations
  // of K numbers having sum equals to N
  static  int totalWays(int N, int K) {
 
    // If N<K
    if (N < K)
      return 0;
 
    // Storing numerator
    int  n1 = factorial(N - 1);
 
    // Storing denominator
    int n2 = factorial(K - 1)*factorial(N - K);
    int ans = (n1/n2);
 
    // Returning answer
    return ans;
  }
 
  // Driver method
  public static void main(String[] args)
  {
 
    int N = 7;
    int K = 3;
    int ans = totalWays(N, K);
    System.out.println(ans);
  }
}
 
// This code is contributed by umadevi9616

Python3

# Python Program for the above approach
 
from math import factorial
 
 
class Solution:
 
    # Function to count
    # all the possible combinations
    # of K numbers having sum equals to N
    def totalWays(self, N, K):
 
        # If N<K
        if (N < K):
            return 0
 
        # Storing numerator
        n1 = factorial(N-1)
 
        # Storing denominator
        n2 = factorial(K-1)*factorial(N-K)
 
        ans = (n1//n2)
 
        # Returning answer
        return ans
 
 
# Driver Code
if __name__ == '__main__':
    N = 7
    K = 3
    ob = Solution()
    ans = ob.totalWays(N, K)
    print(ans)

C#

// C# Program for the above approach
using System;
public class Solution {
 
  // method to find factorial of given number
  static int factorial(int n) {
    if (n == 0)
      return 1;
 
    return n * factorial(n - 1);
  }
 
  // Function to count
  // all the possible combinations
  // of K numbers having sum equals to N
  static int totalWays(int N, int K) {
 
    // If N<K
    if (N < K)
      return 0;
 
    // Storing numerator
    int n1 = factorial(N - 1);
 
    // Storing denominator
    int n2 = factorial(K - 1) * factorial(N - K);
    int ans = (n1 / n2);
 
    // Returning answer
    return ans;
  }
 
  // Driver method
  public static void Main(String[] args) {
 
    int N = 7;
    int K = 3;
    int ans = totalWays(N, K);
    Console.WriteLine(ans);
  }
}
 
// This code is contributed by umadevi9616

Javascript

<script>
// Javascript program for the above approach
 
// Method to find factorial of given number
function factorial(n)
{
    if (n == 0)
        return 1;
         
    return n * factorial(n - 1);
}
 
// Function to count all the possible
// combinations of K numbers having
// sum equals to N
function totalWays( N, K)
{
     
    // If N<K
    if (N < K)
        return 0;
     
    // Storing numerator
    let  n1 = factorial(N - 1);
     
    // Storing denominator
    let n2 = factorial(K - 1) * factorial(N - K);
    let ans = (n1 / n2);
     
    // Returning answer
    return ans;
}
 
// Driver code
let N = 7;
let K = 3;
let ans = totalWays(N, K);
 
document.write(ans);
 
// This code is contributed by Shubham Singh
</script>
Producción

15

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

Publicación traducida automáticamente

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