ในบทความนี้ เราจะใช้ C++ ในการคำนวณจำนวนเส้นทาง W ของน้ำหนักในแผนผัง K-ary ในบทความนี้ เราได้ให้ต้นไม้ K-ary ซึ่งเป็นต้นไม้ที่แต่ละโหนดมีลูก K และแต่ละขอบมีน้ำหนักที่กำหนด โดยน้ำหนักจากมากไปน้อยจาก 1 ถึง K จากโหนดหนึ่งไปยังโหนดลูกทั้งหมด
เราจำเป็นต้องนับจำนวนเส้นทางสะสมที่เริ่มต้นจากรูทที่มีน้ำหนัก W และอย่างน้อยหนึ่งขอบที่มีน้ำหนักเท่ากับ M ดังนั้นนี่คือตัวอย่าง −
Input : W = 4, K = 3, M = 2 Output : 6
ในปัญหาที่กำหนด เราจะใช้ dp เพื่อลดความซับซ้อนของเวลาและพื้นที่ เมื่อใช้การจดบันทึก เราจะทำให้โปรแกรมของเราเร็วขึ้นมากและใช้งานได้สำหรับข้อจำกัดที่ใหญ่ขึ้น
แนวทาง
ในแนวทางนี้ เราจะสำรวจต้นไม้และติดตามขอบที่มีน้ำหนักอย่างน้อย M หากใช้หรือไม่ และให้น้ำหนักเท่ากับ W ดังนั้นเราจึงเพิ่มคำตอบ
อินพุต
#include <bits/stdc++.h> using namespace std; int solve(int DP[][2], int W, int K, int M, int used){ if (W < 0) // if W becomes less than 0 then return 0 return 0; if (W == 0) { if (used) // if used is not zero then return 1 return 1; //as at least one edge of weight M is included return 0; } if (DP[W][used] != -1) // if DP[W][used] is not -1 so that means it has been visited. return DP[W][used]; int answer = 0; for (int i = 1; i <= K; i++) { if (i >= M) answer += solve(DP, W - i, K, M, used | 1); // if the condition is true //then we will change used to 1. else answer += solve(DP, W - i, K, M, used); } return answer; } int main(){ int W = 3; // weight. int K = 3; // the number of children a node has. int M = 2; // we need to include an edge with weight at least 2. int DP[W + 1][2]; // the DP array which will memset(DP, -1, sizeof(DP)); // initializing the array with -1 value cout << solve(DP, W, K, M, 0) << "\n"; return 0; }
ผลลัพธ์
3
คำอธิบายของโค้ดด้านบน
ในแนวทางนี้ การติดตามขอบของน้ำหนักใดๆ M จะรวมไว้อย่างน้อยหนึ่งครั้งหรือไม่ ประการที่สอง เราคำนวณน้ำหนักรวมของเส้นทางถ้ามันเท่ากับ W
เราเพิ่มคำตอบทีละหนึ่ง ทำเครื่องหมายเส้นทางนั้นว่าเยี่ยมชมแล้ว ดำเนินการต่อในเส้นทางที่เป็นไปได้ทั้งหมด และรวมอย่างน้อยหนึ่งขอบที่มีน้ำหนักมากกว่าหรือเท่ากับ M
บทสรุป
ในบทความนี้ เราแก้ปัญหาเพื่อค้นหาจำนวนพาธที่มีน้ำหนัก W ในทรี k-ary โดยใช้โปรแกรมไดนามิกใน O(W*K) ความซับซ้อนของเวลา
เรายังได้เรียนรู้โปรแกรม C++ สำหรับปัญหานี้และแนวทางที่สมบูรณ์ (Normal and excellent ) ซึ่งเราแก้ปัญหานี้ได้