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:
- 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.
- Ahora llame inicialmente a countWaysUtil con los argumentos N , K , sum=0 y dp como una array llena con todo -1 .
- 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.
- Verifique los casos base:
- 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>
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>
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