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

C++ में वाइन की बिक्री से अधिकतम लाभ

समस्या कथन

एक पंक्ति में n वाइन दी गई है, जिसमें पूर्णांक क्रमशः प्रत्येक वाइन की लागत को दर्शाते हैं। हर साल आप पंक्ति में पहली या आखिरी शराब बेच सकते हैं। शराब की कीमत समय के साथ बढ़ती जाती है। बता दें कि वाइन से शुरुआती लाभ P1, P2, P3…Pn है। Yth वर्ष पर, ith वाइन से लाभ Y*Pi होगा। प्रत्येक वर्ष के लिए, आपका कार्य यह दर्शाता है कि पहली या आखिरी शराब बेची जानी चाहिए या नहीं, प्रिंट करना शुरू करें या समाप्त करें। साथ ही, सभी वाइन से अधिकतम लाभ की गणना करें।

उदाहरण

If wine prices are {2, 4, 6, 2, 5} then output will be:
start end end start start
Maximum profit = 64

एल्गोरिदम

हम इस समस्या को हल करने के लिए गतिशील प्रोग्रामिंग का उपयोग कर सकते हैं -

  • विचार यह है कि प्रत्येक राज्य के लिए इष्टतम क्रिया को संग्रहीत किया जाए और उसका उपयोग प्रारंभिक अवस्थाओं से शुरू होने वाले इष्टतम राज्यों के माध्यम से नेविगेट करने के लिए किया जाए

उदाहरण

#include <bits/stdc++.h>
using namespace std;
#define N 1000
int dp[N][N];
int sell[N][N];
int maxProfitUtil(int price[], int begin, int end, int n) {
   if (dp[begin][end] != -1) {
      return dp[begin][end];
   }
   int year = n - (end - begin);
   if (begin == end) {
      return year * price[begin];
   }
   int x = price[begin] * year + maxProfitUtil(price, begin + 1, end, n);
   int y = price[end] * year + maxProfitUtil(price, begin, end - 1, n);
   int ans = max(x, y);
   dp[begin][end] = ans;
   if (x >= y) {
      sell[begin][end] = 0;
   } else {
      sell[begin][end] = 1;
   }
   return ans;
}
int maxProfit(int price[], int n) {
   for (int i = 0; i < N; i++) {
      for (int j = 0; j < N; j++) {
         dp[i][j] = -1;
      }
   }
   int ans = maxProfitUtil(price, 0, n - 1, n);
   int i = 0, j = n - 1;
   while (i <= j) {
      if (sell[i][j] == 0) {
         cout << "start ";
         i++;
      } else {
         cout << "end ";
         j--;
      }
   }
   cout << endl;
   return ans;
}
int main() {
   int price[] = { 2, 4, 6, 2, 5 };
   int n = sizeof(price) / sizeof(price[0]);
   int ans = maxProfit(price, n);
   cout << "Maximum profit = " << ans << endl;
   return 0;
}

आउटपुट

जब आप उपरोक्त प्रोग्राम को संकलित और निष्पादित करते हैं। यह निम्नलिखित आउटपुट उत्पन्न करता है -

start end end start start
Maximum profit = 64

  1. C++ में जॉब शेड्यूलिंग में अधिकतम लाभ

    मान लीजिए कि हमारे पास अलग-अलग कार्य हैं, जहां प्रत्येक कार्य प्रारंभ समय [i] से समाप्ति समय [i] तक किया जाना निर्धारित है, उस कार्य के लिए हमें लाभ का लाभ मिलता है [i]। हम स्टार्टटाइम, एंडटाइम और प्रॉफिट लिस्ट को जानते हैं, हमें अधिकतम लाभ का पता लगाना होगा जो हम इस तरह ले सकते हैं कि ओवरलैपिंग टाइ

  1. सी++ में सरणी से अधिकतम परिधि त्रिभुज

    समस्या कथन गैर-ऋणात्मक पूर्णांकों की एक सरणी को देखते हुए। सरणी से तीन तत्वों का पता लगाएं जो अधिकतम परिधि का त्रिभुज बनाते हैं उदाहरण If input array is {5, 1, 3, 5, 7, 4} then maximum perimeter is (7 + 5 + 5) = 17 है एल्गोरिदम सरणी को गैर-बढ़ते क्रम में क्रमबद्ध करें। तो, पहला तत्व अधिकतम होगा और

  1. सी ++ में वन बनाने के लिए पेड़ से अधिकतम किनारा हटाना

    समस्या कथन एक अप्रत्यक्ष पेड़ को देखते हुए, जिसमें सम संख्या में कोने होते हैं, हमें इस पेड़ से किनारों की अधिकतम संख्या को हटाने की आवश्यकता होती है, ताकि परिणामी जंगल के प्रत्येक जुड़े घटक में सम संख्या में कोने हों। उदाहरण ऊपर दिखाए गए पेड़ में, हम लाल रंग में दिखाए गए अधिकतम 2 किनारों 0-2 और