Dada una array arr[] de tamaño N , la tarea es encontrar el recuento de todos los subconjuntos de la array dada cuyo producto es igual a K.
Ejemplos:
Entrada: arr[] = { 1, 1, 2, 2, 3 }, K = 4
Salida: 4
Explicación:
Los subconjuntos con producto igual a K(= 4) son: { { arr[0], arr[1], arr[2], arr[3] }, { arr[0], arr[2], arr[3] }, { arr[1], arr[2], arr[3] }, { arr[2] , arr[3] } } .
Por lo tanto, la salida requerida es 4Entrada: arr[] = { 1, 1, 2, 2, 3 }, K = 4
Salida: 8
Enfoque: El problema se puede resolver usando Programación Dinámica usando la siguiente relación de recurrencia:
cntSub(idx, prod) = cntSub(idx – 1, prod * arr[i]) + cntSub(idx – 1, prod)
idx: almacena el índice de un elemento de array
prod: almacena el producto de los elementos de un subconjunto
cntSub(i, prod): almacena el recuento de subconjuntos del subarreglo { arr[i], …, arr[N – 1] } cuyo producto es igual a prod .
Siga los pasos a continuación para resolver el problema:
- Inicialice una array 2D , digamos dp[][] , para almacenar los subproblemas superpuestos de la relación de recurrencia anterior.
- Utilizando la relación de recurrencia anterior, calcule el recuento de subconjuntos cuyo producto de elementos es igual a K .
- Finalmente, imprima el valor de dp[N – 1][K] .
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ program to implement // the above approach #include <bits/stdc++.h> using namespace std; #define M 1000 // Function to find the count of subsets // whose product of elements is equal to K int cntSub(int arr[], int idx, int prod, int K, int dp[][M]) { // Base Case if (idx < 0) { return (prod == K); } // If an already computed // subproblem occurred if (dp[idx][prod] != -1) { return dp[idx][prod]; } // Count subsets including idx-th // element in the subset int X = cntSub(arr, idx - 1, prod * arr[idx], K, dp); // Count subsets without including // idx-th element in the subset int Y = cntSub(arr, idx - 1, prod, K, dp); return dp[idx][prod] = X + Y; } // Utility function to count subsets in // an array whose product is equal to K int UtilcntSub(int arr[], int N, int K) { // dp[i][j]: Stores numberof subsets // with product j up to the i-th element int dp[N][M]; // Initialize dp[][] to -1 memset(dp, -1, sizeof(dp)); cout << cntSub(arr, N - 1, 1, K, dp); } // Driver Code int main() { int arr[] = { 1, 1, 2, 2, 3, 4 }; int K = 4; int N = sizeof(arr) / sizeof(arr[0]); UtilcntSub(arr, N, K); }
Java
// Java program to implement // the above approach import java.util.*; class GFG{ static int M = 1000; // Function to find the count of subsets // whose product of elements is equal to K static int cntSub(int arr[], int idx, int prod, int K, int dp[][]) { // Base Case if (idx < 0) { if (prod == K) return 1; else return 0; } // If an already computed // subproblem occurred if (dp[idx][prod] != -1) { return dp[idx][prod]; } // Count subsets including idx-th // element in the subset int X = cntSub(arr, idx - 1, prod * arr[idx], K, dp); // Count subsets without including // idx-th element in the subset int Y = cntSub(arr, idx - 1, prod, K, dp); return dp[idx][prod] = X + Y; } // Utility function to count subsets in // an array whose product is equal to K static void UtilcntSub(int arr[], int N, int K) { // dp[i][j]: Stores numberof subsets // with product j up to the i-th element int[][] dp = new int[N][M]; // Initialize dp[][] to -1 for(int i = 0; i < N; i++) { for(int j = 0; j < M; j++) { dp[i][j] = -1; } } System.out.print(cntSub(arr, N - 1, 1, K, dp)); } // Driver code public static void main(String[] args) { int[] arr = { 1, 1, 2, 2, 3, 4 }; int K = 4; int N = arr.length; UtilcntSub(arr, N, K); } } // This code is contributed by code_hunt
Python3
# Python program to implement # the above approach M = 1000 # Function to find the count of subsets # whose product of elements is equal to K def cntSub(arr, idx, prod, K): global dp # Base Case if (idx < 0): return (prod == K) # If an already computed # subproblem occurred if (dp[idx][prod] != -1): return dp[idx][prod] # Count subsets including idx-th # element in the subset X = cntSub(arr, idx - 1, prod * arr[idx], K) # Count subsets without including # idx-th element in the subset Y = cntSub(arr, idx - 1, prod, K) dp[idx][prod] = X + Y return dp[idx][prod] # Utility function to count subsets in # an array whose product is equal to K def UtilcntSub(arr, N, K): # dp[i][j]: Stores numberof subsets # with product j up to the i-th element print (cntSub(arr, N - 1, 1, K)) # Driver Code if __name__ == '__main__': dp = [[-1 for i in range(1000)] for i in range(1000)] arr = [1, 1, 2, 2, 3, 4] K = 4 N = len(arr) UtilcntSub(arr, N, K) # This code is contributed by mohit kumar 29
C#
// C# program to implement // the above approach using System; class GFG { static int M = 1000; // Function to find the count of subsets // whose product of elements is equal to K static int cntSub(int[] arr, int idx, int prod, int K, int[,] dp) { // Base Case if (idx < 0) { if (prod == K) return 1; else return 0; } // If an already computed // subproblem occurred if (dp[idx, prod] != -1) { return dp[idx, prod]; } // Count subsets including idx-th // element in the subset int X = cntSub(arr, idx - 1, prod * arr[idx], K, dp); // Count subsets without including // idx-th element in the subset int Y = cntSub(arr, idx - 1, prod, K, dp); return dp[idx, prod] = X + Y; } // Utility function to count subsets in // an array whose product is equal to K static void UtilcntSub(int[] arr, int N, int K) { // dp[i][j]: Stores numberof subsets // with product j up to the i-th element int[,] dp = new int[N, M]; // Initialize dp[][] to -1 for(int i = 0; i < N; i++) { for(int j = 0; j < M; j++) { dp[i, j] = -1; } } Console.Write(cntSub(arr, N - 1, 1, K, dp)); } // Driver code public static void Main() { int[] arr = { 1, 1, 2, 2, 3, 4 }; int K = 4; int N = arr.Length; UtilcntSub(arr, N, K); } } // This code is contributed by susmitakundugoaldanga
Javascript
<script> // JavaScript program to implement // the above approach let M = 1000; // Function to find the count of subsets // whose product of elements is equal to K function cntSub(arr, idx, prod, K, dp) { // Base Case if (idx < 0) { if (prod == K) return 1; else return 0; } // If an already computed // subproblem occurred if (dp[idx][prod] != -1) { return dp[idx][prod]; } // Count subsets including idx-th // element in the subset let X = cntSub(arr, idx - 1, prod * arr[idx], K, dp); // Count subsets without including // idx-th element in the subset let Y = cntSub(arr, idx - 1, prod, K, dp); return dp[idx][prod] = X + Y; } // Utility function to count subsets in // an array whose product is equal to K function UtilcntSub(arr, N, K) { // dp[i][j]: Stores numberof subsets // with product j up to the i-th element let dp = new Array(N); // Loop to create 2D array using 1D array for (var i = 0; i < dp.length; i++) { dp[i] = new Array(2); } // Initialize dp[][] to -1 for(let i = 0; i < N; i++) { for(let j = 0; j < M; j++) { dp[i][j] = -1; } } document.write(cntSub(arr, N - 1, 1, K, dp)); } // Driver code let arr = [ 1, 1, 2, 2, 3, 4 ]; let K = 4; let N = arr.length; UtilcntSub(arr, N, K); </script>
8
Complejidad temporal: O(N * K)
Espacio auxiliar: O(N * K)
Publicación traducida automáticamente
Artículo escrito por mishrapriyanshu557 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA