Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ค้นหาจำนวนเส้นทางของน้ำหนัก W ในทรี K-ary โดยใช้ C++


ในบทความนี้ เราจะใช้ 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 ) ซึ่งเราแก้ปัญหานี้ได้