Cho một cây có thể mở rộng vô hạn, biến child lưu số lượng nút con của mỗi nút, biến weight lưu trọng số liên quan đến đường đi, và biến path lưu đường đi. Nhiệm vụ là tính số lượng đường đi có tổng trọng số bằng X và có ít nhất một cạnh với trọng số M.
Ví dụ
Đầu vào: child = 4, weight = 4, path = 4
Đầu ra: Số đường đi thỏa mãn: 1
Giải thích: Nút có 4 nút con kết nối bằng 4 đường đi trọng số 4. Chỉ có một đường đi có trọng số 4 là 1 → 4, nên đếm = 1.
Đầu vào: child = 3, weight = 2, path = 4
Đầu ra: Số đường đi thỏa mãn: 4
Giải thích: Nút có 3 nút con, 4 đường đi trọng số 2. Có 4 đường đi trọng số 2: 1-1, 1-2, 2-1, 2-1 (đếm = 4).
Phương pháp sử dụng
- Nhập số lượng nút con, đường đi và trọng số vào các biến
child,weight,path. - Khai báo mảng kích thước cho trước.
- Vòng lặp
FORtừi = 0đến kích thước mảng. Bên trong, vòng lặpFORtừj = 0đếnj < 2đặtarr[i][j] = -1. - Gọi hàm
total_weight()với tham sốpath, 0, weight, child, arr. - Trong hàm:
- Khai báo biến tạm
countlưu kết quả. - Nếu
path < 0trả về 0. - Nếu
path == 0trả vềi. - Nếu
arr[path][i] != -1trả vềarr[path][i]. - Vòng lặp
FORtừj = 1đếnchild. Nếuj == weightgọi đệ quytotal_weight(path - j, 1, weight, child, arr), ngược lại gọitotal_weight(path - j, i, weight, child, arr). - Gán
arr[path][i] = countvà trả về.
- Khai báo biến tạm
- In kết quả.
Ví dụ mã nguồn
#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);
}
Chạy mã trên cho kết quả:
Kết quả
Count of number of paths whose weight is exactly X and has at-least one edge of weight M are: 1