计算在C ++中权重精确为X并且权重至少为M的路径的数量

我们给了我们一棵树,它可以有无穷的层次,一个可变的子节点将存储一个节点可以拥有的子节点数,一个可变的权重将存储与路径关联的权重,而一个可变的路径将存储路径和任务是计算具有等于X的权重的路径数,并且必须至少有一条具有给定权重的边。

例如

输入-int child = 4,权重= 4,路径= 4; 

输出-权重正好为X且权重至少为M的路径的数量为:1

解释-正如我们给的那样,该节点有4个子节点,这些子节点与4条路径相连,并且权重为4。因此,我们可以看到只有一条路径的权重为4,即1-4,因此计数为1。 

输入-int child = 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作为参数传递给函数,来检查IF j等于权重大于设置的计数,作为对函数的递归调用。

    • 否则,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

猜你喜欢