Dado un árbol K-ario, donde cada Node tiene K hijos y cada borde tiene algo de peso. Todos los bordes, es decir, K, que van desde un Node en particular a todos sus hijos tienen pesos en orden ascendente 1, 2, 3, …, K. Encuentre el número de caminos que tienen un peso total como W (suma de todos los pesos de los bordes en el camino ) a partir de la raíz y que contiene al menos un borde de peso al menos M.
Ejemplos:
Input : W = 3, K = 3, M = 2 Output : 3 Explanation : One path can be (1 + 2), second can be (2 + 1) and third is 3.
Input : W = 4, K = 3, M = 2 Output : 6
Enfoque: Este problema se puede resolver utilizando el enfoque de programación dinámica. La idea es mantener dos estados, uno para que se requiera el peso actual y otro para una variable booleana que denota que la ruta actual ha incluido un borde de peso al menos M o no. Iterar sobre todos los pesos de borde posibles, es decir, K y resolver recursivamente para el peso W – i para 1 ≤ i ≤ K . Si el peso del borde actual es mayor o igual a M, configure la variable booleana como 1 para la siguiente llamada.
A continuación se muestra la implementación del enfoque anterior.
C++
// C++ program to count the number of // paths with weight W in a K-ary tree #include <bits/stdc++.h> using namespace std; // Function to return the number of ways // having weight as wt in K-ary tree int solve(int dp[][2], int wt, int K, int M, int used) { // Return 0 if weight becomes less // than zero if (wt < 0) return 0; if (wt == 0) { // Return one only if the // current path has included // edge weight of atleast M if (used) return 1; return 0; } if (dp[wt][used] != -1) return dp[wt][used]; int ans = 0; for (int i = 1; i <= K; i++) { // If the current edge weight // is greater than or equal to // M, set used as true if (i >= M) ans += solve(dp, wt - i, K, M, used | 1); else ans += solve(dp, wt - i, K, M, used); } return dp[wt][used] = ans; } // Driver Code to test above function int main() { int W = 3, K = 3, M = 2; int dp[W + 1][2]; memset(dp, -1, sizeof(dp)); cout << solve(dp, W, K, M, 0) << endl; return 0; }
Java
// Java program to count the number of // paths with weight W in a K-ary tree class GFG { // Function to return the number of ways // having weight as wt in K-ary tree public static int solve(int[][] dp, int wt, int K, int M, int used) { // Return 0 if weight becomes less // than zero if (wt < 0) { return 0; } if (wt == 0) { // Return one only if the // current path has included // edge weight of atleast M if (used == 1) { return 1; } return 0; } if (dp[wt][used] != -1) { return dp[wt][used]; } int ans = 0; for (int i = 1; i <= K; i++) { // If the current edge weight // is greater than or equal to // M, set used as true if (i >= M) { ans += solve(dp, wt - i, K, M, used | 1); } else { ans += solve(dp, wt - i, K, M, used); } } return dp[wt][used] = ans; } // Driver Code public static void main(String[] args) { int W = 3, K = 3, M = 2; int[][] dp = new int[W + 1][2]; for (int i = 0; i < W + 1; i++) { for (int j = 0; j < 2; j++) { dp[i][j] = -1; } } System.out.print(solve(dp, W, K, M, 0) + "\n"); } } // This code has been contributed by 29AjayKumar
Python3
# Python 3 program to count the number of # paths with weight W in a K-ary tree import numpy as np # Function to return the number of ways # having weight as wt in K-ary tree def solve(dp, wt, K, M, used) : # Return 0 if weight becomes less # than zero if (wt < 0) : return 0 if (wt == 0) : # Return one only if the # current path has included # edge weight of atleast M if (used) : return 1 return 0 if (dp[wt][used] != -1) : return dp[wt][used] ans = 0 for i in range(1, K + 1) : # If the current edge weight # is greater than or equal to # M, set used as true if (i >= M) : ans += solve(dp, wt - i, K, M, used | 1) else : ans += solve(dp, wt - i, K, M, used) dp[wt][used] = ans return ans # Driver Code if __name__ == "__main__" : W = 3 K = 3 M = 2 dp = np.ones((W + 1, 2)); dp = -1 * dp print(solve(dp, W, K, M, 0)) # This code is contributed by Ryuga
C#
// C# program to count the number of // paths with weight W in a K-ary tree using System; class GFG { // Function to return the number of ways // having weight as wt in K-ary tree public static int solve(int[,] dp, int wt, int K, int M, int used) { // Return 0 if weight becomes less // than zero if (wt < 0) return 0; if (wt == 0) { // Return one only if the // current path has included // edge weight of atleast M if (used == 1) return 1; return 0; } if (dp[wt,used] != -1) return dp[wt,used]; int ans = 0; for (int i = 1; i <= K; i++) { // If the current edge weight // is greater than or equal to // M, set used as true if (i >= M) ans += solve(dp, wt - i, K, M, used | 1); else ans += solve(dp, wt - i, K, M, used); } return dp[wt,used] = ans; } // Driver Code to test above function static void Main() { int W = 3, K = 3, M = 2; int[,] dp = new int[W + 1,2]; for(int i = 0;i < W + 1; i++) for(int j = 0; j < 2; j++) dp[i,j] = -1; Console.Write(solve(dp, W, K, M, 0) + "\n"); } //This code is contributed by DrRoot_ }
Javascript
<script> // Javascript program to count the number of // paths with weight W in a K-ary tree // Function to return the number of ways // having weight as wt in K-ary tree function solve(dp, wt, K, M, used) { // Return 0 if weight becomes less // than zero if (wt < 0) { return 0; } if (wt == 0) { // Return one only if the // current path has included // edge weight of atleast M if (used == 1) { return 1; } return 0; } if (dp[wt][used] != -1) { return dp[wt][used]; } let ans = 0; for (let i = 1; i <= K; i++) { // If the current edge weight // is greater than or equal to // M, set used as true if (i >= M) { ans += solve(dp, wt - i, K, M, used | 1); } else { ans += solve(dp, wt - i, K, M, used); } } return dp[wt][used] = ans; } let W = 3, K = 3, M = 2; let dp = new Array(W + 1); for (let i = 0; i < W + 1; i++) { dp[i] = new Array(2); for (let j = 0; j < 2; j++) { dp[i][j] = -1; } } document.write(solve(dp, W, K, M, 0) + "</br>"); // This code is contributed by suresh07. </script>
3
Complejidad de tiempo: O(W * K)
Publicación traducida automáticamente
Artículo escrito por Nishant Tanwar y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA