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

C++ में सबसेट्स पर योग - डायनामिक प्रोग्रामिंग


इस समस्या में, हमें आकार 2n का एक ऐरे arr[] दिया गया है। हमारा कार्य डायनामिक प्रोग्रामिंग का उपयोग करके सबसेट्स पर योग खोजने के लिए एक प्रोग्राम बनाना है।

हमें फंक्शन की गणना करने की आवश्यकता है, F(x) = Σ Ai जैसे कि x&i == i सभी x के लिए। यानी i, x का बिटवाइज़ सबसेट है।

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

इनपुट: A[] = {5, 7, 1, 9} , n = 2

आउटपुट: 5 12 6 22

व्याख्या: n = 2 के लिए, x के 4 मान हैं। वे 0, 1, 2, 3 हैं।

अब, फंक्शन के मानों की गणना:

F(0) = A0 = 5
F(1) = A0 + A1 = 5 + 7 = 12
F(2) = A0 + A2 = 5 + 1 = 6
F(3) = A0 + A1 + A2 + A3 = 5 + 7 + 1 + 9 = 22


इस समस्या का समाधान डायनामिक प्रोग्रामिंग, का उपयोग करके, हम मास्क को देखेंगे और हर मास्क का बिटवाइज़ सबसेट खोजेंगे। हम डायनामिक प्रोग्रामिंग का उपयोग करके बिटवाइज़ सबसेट को स्टोर करेंगे, जो पुनरावृत्तियों की संख्या को कम करेगा। एक इंडेक्स जिसमें सेट बिट या अनसेट बिट है, 2n मास्क द्वारा एक से अधिक बार देखा जाएगा।

हम i इंडेक्स पर बिट के आधार पर पुनरावृत्ति करेंगे:

जब i-वां बिट सेट हो :

          DP(mask, i) = DP(mask, i-1) U DP(mask 2i, i-1)

जब i-वां बिट अनसेट हो :

          DP(mask, i) = DP(mask, i-1)

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

उदाहरण

#include <iostream> using namespace std; const int N = 1000; void SumOverSubsets(int a[], int n) {        int sum[1 << n] = {0};    int DP[N][N];    for (int i = 0; i < (1 << n); i++) {       for (int j = 0; j < n; j++) {          if (i & (1 << j)) {             if (j == 0)                DP[i][j] = a[i] + a[i ^ (1 << j)];             else                DP[i][j] = DP[i][j - 1] + DP[i ^ (1 << j)][j - 1];          } else {             if (j == 0)                DP[i][j] = a[i];             else                DP[i][j] = DP[i][j - 1];          }       }       sum[i] = DP[i][n - 1];    }    for (int i = 0; i < (1 << n); i++)       cout<<sum[i]<<"\t"; } int main() {    int A[] = {5, 7, 1, 9};    int n = 2;      cout<<"The sum over subsets is \t";    SumOverSubsets(A, n);      return 0; }

आउटपुट

The sum over subsets is 5 12 6 22

  1. - C++ बनाम C# - प्रमुख अंतर

    C++ प्रोग्रामिंग भाषा C प्रोग्रामिंग भाषा का उत्तराधिकारी जिसने क्लासेस और ऑब्जेक्ट्स की अवधारणा पेश की। यह C और उच्च-स्तरीय भाषा की विशेषताओं को समाहित करता है, इसलिए इसे मध्यवर्ती-स्तरीय भाषा माना जा सकता है। जब इसे बनाया गया था, तो इसे C के समान होने के कारण क्लासेस वाला C माना जाता था। C# प्रोग्

  1. - C++ में एलिक्वॉट योग (Aliquot Sum)

    यहां हम देखेंगे कि एलिक्वॉट योग क्या है? n का एलिक्वॉट योग n को छोड़कर n के सभी पूर्ण गुणनखंडों का योग है। उदाहरण के लिए, यदि संख्या 20 है, तो पूर्ण गुणनखंड (1, 2, 4, 5, 10) हैं। तो एलिक्वॉट योग 22 है। एक दिलचस्प तथ्य यह है कि, यदि किसी संख्या का एलिक्वॉट योग संख्या स्वयं है, तो वह संख्या एक पूर्ण

  1. - C++ प्रोग्राम: डायनामिक प्रोग्रामिंग से इष्टतम पैरेंथेसाइज़ेशन

    यह एक C++ प्रोग्राम है जो डायनामिक प्रोग्रामिंग का उपयोग करके इष्टतम पैरेंथेसाइज़ेशन (Optimal Parenthesization) करता है। एल्गोरिदम Begin    लंबाई n और मैट्रिक्स के डायमेंशन को इनपुट के रूप में लें।    MatrixChain() न्यूनतम मल्टीप्लिकेशन खोजने के लिए:    Arguments: &nbs