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

C++ प्रोग्राम में किसी सरणी का अधिकतम उत्पाद उपसमुच्चय


समस्या में, हमें n पूर्णांक मानों का एक सरणी arr[] दिया जाता है। हमारा काम किसी सरणी के अधिकतम उत्पाद सबसेट को खोजने के लिए एक प्रोग्राम बनाना है।

समस्या का विवरण - यहां, हमें किसी सरणी के तत्वों के सबसेट के अधिकतम संभव उत्पाद की गणना करने की आवश्यकता है।

सबसेट - एक सरणी उप [] सरणी गिरफ्तारी का एक सबसेट है [] यदि उप [] के सभी तत्व गिरफ्तारी [] में मौजूद हैं।

समस्या को समझने के लिए एक उदाहरण लेते हैं,

इनपुट

arr[] = {4, 5, 2, −1, 3}

आउटपुट

40

स्पष्टीकरण

Subset sub[] = {4, 5, 2}
Prod = 4*5*2 = 40

समाधान दृष्टिकोण

समस्या को हल करने का एक सरल और आसान तरीका है, सरणी के सभी संभावित सबसेट बनाना। उनके उत्पाद ढूंढें और उनमें से अधिकतम लौटाएं।

इस समाधान को लागू करना आसान है, लेकिन इसके लिए नेस्टेड लूप की आवश्यकता होती है, जो O(n 2 के क्रम की जटिलता को बढ़ाता है। *एन)।

यहां कार्यान्वयन का प्रयास करें।

प्रभावी समाधान सरणी से ऋणात्मक (nofNeg) और शून्य (nof0) की संख्या की गणना करके और फिर इन शर्तों के आधार पर maxProd की गणना करें।

केस 1 (nof0 =0 और nofNeg सम है)− उत्पाद में सरणी के सभी तत्वों पर विचार करें।

maxProd =arr[0] * arr[1] * … arr[n−1]

केस 2 (nof0 =0 और nofNeg विषम है) - सरणी के सबसे बड़े ऋणात्मक तत्व (0 के निकटतम) को छोड़कर सरणी के सभी तत्वों पर विचार करें।

केस 3 (nof0 !=0)− उत्पाद के लिए सरणी के सभी शून्य छोड़ दें। और मामले 1 और 2 के समान मामलों को लें।

विशेष मामला - 0 को छोड़कर केवल एक तत्व ऋणात्मक है। मैक्सप्रोड =0.

एल्गोरिदम

आरंभ करें -

maxProd = 1;

चरण 1 -

Loop the array and count, nof0(number of zeros) and
nofNeg(number of negatives), and find maxProd.
maxProd = maxProd*arr[i], i −> 0 to n−1
खोजें।

चरण 2 -

consider the following cases −
Case 1− if(nofNeg%2 == 0): maxProd
Case 2− if(nofNeg%2 != 0): maxProd = maxProd/(largestNeg)
Case 3 − if(nof0 == (n-1) and nofNeg == 1), maxProd = 0.

चरण 3

Print maxProd.

उदाहरण

हमारे समाधान की कार्यप्रणाली को दर्शाने वाला कार्यक्रम,

#include <iostream>
using namespace std;
int findMaxSubsetProd(int arr[], int n){
   int larNeg = −1000;
   int nofNeg = 0, Nof0 = 0;
   int maxProd = 1;
   for (int i = 0; i < n; i++) {
      if (arr[i] == 0){
         Nof0++;
         continue;
      }
      else if (arr[i] < 0) {
         nofNeg++;
         if(larNeg < arr[i])
         larNeg = arr[i];
      }
      maxProd = maxProd * arr[i];
   }
   if(nofNeg%2 == 0){
      return maxProd;
   }
   else if(nofNeg%2 != 0)
      return (maxProd / larNeg);
   if(Nof0 == (n−1) and nofNeg == 1)
      return 0;
   return maxProd;
}
int main(){
   int arr[] = {4, −2, 5, −1, 3, −6};
   int n = sizeof(arr)/sizeof(arr[0]);
   cout<<"The maximum product subset of an array is "<<findMaxSubsetProd(arr, n);
   return 0;
}

आउटपुट

The maximum product subset of an array is 720

  1. C++ में किसी सरणी की बिटनोसिटी की जांच करने का कार्यक्रम

    एन पूर्णांकों की एक सरणी गिरफ्तारी [एन] को देखते हुए, कार्य यह जांचना है कि दिया गया सरणी बिटोनिक है या नहीं। यदि दी गई सरणी बिटोनिक है तो हां यह एक बिटोनिक सरणी है प्रिंट करें, अन्यथा प्रिंट करें नहीं यह एक बिटोनिक सरणी नहीं है। एक बिटोनिक सरणी तब होती है जब सरणी पहले सख्ती से बढ़ते क्रम में होती

  1. सी ++ में एक उत्पाद सरणी पहेली?

    यहां हम सरणी से संबंधित एक दिलचस्प समस्या देखेंगे। n तत्वों के साथ एक सरणी है। हमें n तत्वों की एक और सरणी बनानी है। लेकिन दूसरी सरणी की i-वें स्थिति i-वें तत्व को छोड़कर पहले सरणी के सभी तत्वों का गुणनफल धारण करेगी। और एक बाधा यह है कि हम इस समस्या में डिवीजन ऑपरेटर का उपयोग नहीं कर सकते हैं। यदि

  1. C++ प्रोग्राम बिट ऐरे को लागू करने के लिए

    बिट ऐरे को लागू करने के लिए यह एक सी ++ प्रोग्राम है। एक बिट ऐरे एक सरणी डेटा संरचना है जो डेटा को कॉम्पैक्ट रूप से संग्रहीत करती है। यह मूल रूप से एक साधारण डेटा संरचना को लागू करने के लिए उपयोग किया जाता है। एल्गोरिदम कार्य और छद्म कोड: Begin    Function getBit(int val,int pos)