Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

बोर्ड को C++ में वर्गों में काटने की न्यूनतम लागत

अवधारणा

मान लीजिए कि लंबाई p और चौड़ाई q का एक बोर्ड दिया गया है, हमें इस बोर्ड को p*q वर्गों में तोड़ने की आवश्यकता है ताकि तोड़ने की लागत कम से कम हो। इस बोर्ड के लिए हर किनारे के लिए कटिंग कॉस्ट दी जाएगी। संक्षेप में, हमें काटने के ऐसे क्रम का चयन करने की आवश्यकता है जिससे लागत कम से कम हो।

>उदाहरण

बोर्ड को C++ में वर्गों में काटने की न्यूनतम लागत

उपरोक्त बोर्ड के संबंध में वर्ग में कटौती करने का इष्टतम तरीका है -

उपरोक्त मामले में कुल न्यूनतम लागत 65 है। इसकी गणना निम्नलिखित चरणों को लागू करके की जाती है।

Initial Value : Total_cost = 0
Total_cost = Total_cost + edge_cost * total_pieces
Cost 5 Horizontal cut Cost = 0 + 5*1 = 5
Cost 5 Vertical cut Cost = 5 + 5*2 = 15
Cost 4 Vertical cut Cost = 15 + 4*2 = 23
Cost 3 Horizontal cut Cost = 23 + 3*3 = 32
Cost 3 Vertical cut Cost = 32 + 3*3 = 41
Cost 2 Horizontal cut Cost = 41 + 2*4 = 49
Cost 2 Vertical cut Cost = 49 + 2*4 = 57
Cost 2 Vertical cut Cost = 57 + 2*4 = 65

विधि

लालची दृष्टिकोण को लागू करके इस प्रकार की समस्या को हल किया जा सकता है। यदि कुल लागत को S द्वारा माना जाता है, तो S =b1x1 + b2x2 … + bkxk, जहां xi को कुछ किनारे काटने की लागत के रूप में माना जाता है और द्वि संबंधित गुणांक है, गुणांक द्वि को कटौती की कुल संख्या से निर्धारित किया जाता है जिसे हमने बढ़त को लागू करने के लिए प्रतिस्पर्धा की है xi काटने की प्रक्रिया के अंत में।

हमें ध्यान देना चाहिए कि गुणांकों का योग हमेशा स्थिर होता है, इसलिए हम द्वि प्राप्य वितरण की गणना करना चाहते हैं जैसे कि एस सबसे कम है। ऐसा करने के लिए हम जितनी जल्दी हो सके सबसे बड़े लागत किनारे पर कटौती करते हैं, जो इष्टतम एस तक पहुंच जाएगा। अगर हमें समान लागत वाले कई किनारों का सामना करना पड़ता है, तो हम उनमें से किसी एक को पहले हटा या काट सकते हैं।

C++ प्रोग्राम

उपरोक्त दृष्टिकोण को लागू करने वाला समाधान निम्नलिखित है, पहले हमने किनारे काटने की लागत को उल्टे क्रम में क्रमबद्ध किया, और फिर हम अपने समाधान के निर्माण में उच्च लागत से कम लागत तक उनमें लूप करते हैं। हर बार जब हम किनारे का चयन करते हैं, तो समकक्ष संख्या 1 से बढ़ जाती है, जिसे हर बार संबंधित किनारे काटने की लागत से गुणा किया जाता है।

उदाहरण

// C++ program to divide a board into p*q squares
#include <bits/stdc++.h>
using namespace std;
int minimumCostOfBreaking(int X1[], int Y1[], int p, int q){
   int res1 = 0;
   sort(X1, X1 + p, greater<int>());
   sort(Y1, Y1 + q, greater<int>());
   int hzntl = 1, vert = 1;
   int i = 0, j = 0;
   while (i < p && j < q){
      if (X1[i] > Y1[j]){
         res1 += X1[i] * vert;
         hzntl++;
         i++;
      }
      else{
         res1 += Y1[j] * hzntl;
         vert++;
         j++;
      }
   }
   int total = 0;
   while (i < p)
      total += X1[i++];
   res1 += total * vert;
   total = 0;
   while (j < q)
      total += Y1[j++];
   res1 += total * hzntl;
   return res1;
}
int main(){
   int p = 6, q = 4;
   int X1[p-1] = {3, 2, 4, 2, 5};
   int Y1[q-1] = {5, 2, 3};
   cout << minimumCostOfBreaking(X1, Y1, p-1, q-1);
   return 0;
}

आउटपुट

65

  1. बोर्ड को C++ में वर्गों में काटने की न्यूनतम लागत

    अवधारणा मान लीजिए कि लंबाई p और चौड़ाई q का एक बोर्ड दिया गया है, हमें इस बोर्ड को p*q वर्गों में तोड़ने की आवश्यकता है ताकि तोड़ने की लागत कम से कम हो। इस बोर्ड के लिए हर किनारे के लिए कटिंग कॉस्ट दी जाएगी। संक्षेप में, हमें काटने के ऐसे क्रम का चयन करने की आवश्यकता है जिससे लागत कम से कम हो। उदाह

  1. C++ में न्यूनतम नाइट मूव्स

    मान लीजिए कि हमारे पास एक अनंत शतरंज की बिसात है जिसमें -infinity से +infinity तक के निर्देशांक हैं, और हमारे पास वर्ग [0, 0] पर एक नाइट है। एक शूरवीर के पास 8 संभावित चालें हैं, जैसा कि नीचे दिखाया गया है। प्रत्येक चाल एक कार्डिनल दिशा में दो वर्ग है, फिर एक वर्ग एक ओर्थोगोनल दिशा में है। हमें न

  1. पायथन में एक बोर्ड को वर्गों में काटने की न्यूनतम लागत

    मान लीजिए हमारे पास लंबाई p और चौड़ाई q का एक बोर्ड है; हमें इस बोर्ड को p*q संख्या के वर्गों में तोड़ना है ताकि तोड़ने की लागत यथासंभव न्यूनतम हो। प्रत्येक किनारे के लिए काटने की लागत दी जाएगी। इसलिए, यदि इनपुट X_slice =[3,2,4,2,5], Y_slice =[5,2,3] जैसा है तो आउटपुट 65 . होगा इसे हल करने के ल