计算在C ++中权重精确为X并且权重至少为M的路径的数量
我们给了我们一棵树,它可以有无穷的层次,一个可变的子节点将存储一个节点可以拥有的子节点数,一个可变的权重将存储与路径关联的权重,而一个可变的路径将存储路径和任务是计算具有等于X的权重的路径数,并且必须至少有一条具有给定权重的边。
例如
输入-intchild=4,权重=4,路径=4;
输出-权重正好为X且权重至少为M的路径的数量为:1
解释-正如我们给的那样,该节点有4个子节点,这些子节点与4条路径相连,并且权重为4。因此,我们可以看到只有一条路径的权重为4,即1-4,因此计数为1。
输入-intchild=3,权重=2,路径=4;
输出-权重正好为X且权重至少为M的路径的数量为:4
解释-正如我们给的那样,该节点具有3个子节点,这些子节点与4条路径相连,并且权重2与该路径相关联。因此,我们可以看到有四个权重为2的路径,即1-1、1-2、2-1和2-1,因此计数为4。
以下程序中使用的方法如下
在变量的子级,权重和路径中分别输入与每个路径关联的子级总数,路径和权重。
声明给定大小的数组。
从i到0的FOR循环开始,直到一个数组的大小为止。在循环内部,从j到0开始另一个循环FOR,直到j小于2,然后将arr[i][j]设置为-1。
现在total_weight()通过将路径,0,权重,子项和arr传递为函数的参数来调用该函数。
在函数内部,
声明一个临时变量计数以存储结果。
检查IF路径小于0,然后返回0
检查IF路径是否等于0,然后返回i
检查如果arr[path][i]不等于1,然后返回arr[path][i]
从j到1直到孩子开始循环FOR。在循环内部,total_weight()通过将path-j,1,weight,child和arr作为参数传递给函数,来检查IFj等于权重大于设置的计数,作为对函数的递归调用。
否则,total_weight()通过将path-j,i,weight,child和arr作为参数传递给函数,将count设置为对函数的递归调用。
将arr[path][i]设置为count和
返回arr[path][i]
打印结果。
示例
#include <bits/stdc++.h> using namespace std; #define size 4 #define col 4 int total_weight(int path, int i, int weight, int child, int arr[size + 1][col]) { int count = 0; if (path < 0) { return 0; } if (path == 0) { return i; } if (arr[path][i] != -1) { return arr[path][i]; } for (int j = 1; j <= child; j++) { if (j == weight) { count += total_weight(path - j, 1, weight, child, arr); } else { count += total_weight(path - j, i, weight, child, arr); } } arr[path][i] = count; return arr[path][i]; } int main() { int child = 4, weight = 4, path = 4; int arr[size + 1][col]; for (int i = 0; i <= size; i++) { for (int j = 0; j < 2; j++) { arr[i][j] = -1; } } cout << "Count of number of paths whose weight is exactly X and has at-least one edge of weight M are: " << total_weight(path, 0, weight, child, arr); }
如果我们运行上面的代码,它将生成以下输出-
输出结果
Count of number of paths whose weight is exactly X and has at-least one edge of weight M are: 1