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

C++ में एक सेट को k उपसमुच्चयों में विभाजित करने के तरीकों की संख्या गिनें


समस्या विवरण

दो संख्याएं e और p दी गई हैं। लक्ष्य उन तरीकों की संख्या गिनना है जिनसे हम एक सेट के e तत्वों को p पार्टीशन/उपसमुच्चयों में विभाजित कर सकते हैं।

उदाहरण

इनपुट

e=4 p=2

आउटपुट

सेट को k उपसमुच्चयों में विभाजित करने के तरीकों की संख्या: 7

व्याख्या

यदि तत्व हैं: a b c d तो उन्हें 2 पार्टीशन में विभाजित करने के तरीके: (a,b,c)-(d), (a,b)-(c,d), (a,b,c)-(d), (a)-(b,c,d), (a,c)-(b,d), (a,c,d)-(b), (a,b,d)-(c)। कुल 7 तरीके।

इनपुट

e=2 p=2

आउटपुट

सेट को k उपसमुच्चयों में विभाजित करने के तरीकों की संख्या: 1

व्याख्या

यदि तत्व हैं: a b तो उन्हें 2 पार्टीशन में विभाजित करने के तरीके: (a)-(b)। केवल 1 तरीका।

दृष्टिकोण

इस दृष्टिकोण में हम डायनामिक प्रोग्रामिंग दृष्टिकोण का उपयोग करेंगे। समाधान में उपयोग की जाने वाली गणनाएं हमेशा पुनरावर्ती होंगी। यदि हम तत्वों को p पार्टीशन में विभाजित करते हैं तो:

  • यदि e-1 तत्वों को p पार्टीशन में ways(e-1,p) तरीकों से विभाजित किया जा सकता है। तब हम वर्तमान तत्व को इन p पार्टीशन में से किसी एक में p * ways(e-1,p) तरीकों से रख सकते हैं।
  • यदि e-1 तत्वों को p-1 पार्टीशन में ways(e-1,p-1) तरीकों से विभाजित किया जाता है तो उस अलग 1 पार्टीशन में 1 तत्व रखने के 1 * ways(e-1,p-1) तरीके होंगे। कुल तरीके होंगे p * ways(e-1,p) + ways(e-1,p-1)। यह विधि पुनरावर्ती हो जाएगी।

जैसा कि ऊपर दिखाया गया है, डुप्लिकेट गणनाएं की जाएंगी। इससे बचने के लिए हम डायनामिक प्रोग्रामिंग दृष्टिकोण का उपयोग करेंगे।

एल्गोरिदम चरण

  • चर elements और partitions इनपुट के रूप में लें।
  • फंक्शन partition_k(int elements, int partition) दोनों चर लेता है और सेट को k उपसमुच्चयों में विभाजित करने के तरीकों की संख्या लौटाता है।
  • मान ways(e,p) को arr[e][p] में संग्रहीत करने के लिए 2D सरणी arr[elements + 1][partition + 1] लें।
  • for लूप का उपयोग करके i=0 से i=elements तक, arr[i][0] = 0 सेट करें क्योंकि पार्टीशन की संख्या 0 है तो ways(i,0)=0।
  • फिर से for लूप का उपयोग करके j=0 से j=partitions तक, arr[0][j] = 0 सेट करें क्योंकि तत्वों की संख्या 0 है तो ways(0,j)=0।
  • अब दो for लूप का उपयोग करके i=1 से i<=elements और j=1 से j<=i तक arr[][] को पार करें और शेष मान भरें।
  • एकल तत्व के लिए, तरीके=1 या x तत्वों को x पार्टीशन में विभाजित करने के लिए केवल 1 तरीका है। इसलिए arr[i][j] = 1 सेट करें यदि i==j या j==1।
  • अन्यथा temp_1 = arr[i-1][j-1] और temp_2 = arr[i-1][j] लें और arr[i][j] = j * temp_2 + temp_1 अपडेट करें।
  • सभी लूप के अंत में हमारे पास arr[elements][partition] कुल तरीकों के रूप में होगा।
  • परिणाम के रूप में arr[elements][partition] लौटाएं।

C++ कोड उदाहरण

#include <iostream>
using namespace std;

int partition_k(int elements, int partition) {
    int arr[elements + 1][partition + 1];
    for(int i = 0; i <= elements; i++) {
        arr[i][0] = 0;
    }
    for(int j = 0; j <= partition; j++) {
        arr[0][j] = 0;
    }
    for(int i = 1; i <= elements; i++) {
        for (int j = 1; j <= i; j++) {
            if (j == 1 || i == j) {
                arr[i][j] = 1;
            } else {
                int temp_1 = arr[i-1][j-1];
                int temp_2 = arr[i-1][j];
                arr[i][j] = j * temp_2 + temp_1;
            }
        }
    }
    return arr[elements][partition];
}

int main() {
    int elements = 4;
    int partition = 2;
    cout << "सेट को k उपसमुच्चयों में विभाजित करने के तरीकों की संख्या: " << partition_k(elements, partition);
    return 0;
}

आउटपुट

सेट को k उपसमुच्चयों में विभाजित करने के तरीकों की संख्या: 7
  1. C++ में आयत में वर्गों की संख्या गिनना C++ में आयत में वर्गों की संख्या गिनना

    =B। लक्ष्य LxB आकार के आयत में समायोजित किए जा सकने वाले वर्गों की संख्या ढूंढना है। उपरोक्त आकृति 3x2 आकार के एक आयत को दर्शाती है। इसमें 2, 2x2 वर्ग और 6, 1x1 वर्ग हैं। कुल वर्ग = 6+2=8। LxB आकार के हर आयत में L*B संख्या के 1x1 वर्ग होते हैं। सबसे बड़े वर्ग BxB आकार के होते हैं। L=B=1 के लिए, वर

  1. - C++ में बेल नंबर्स - सेट को पार्टीशन करने के तरीकों की संख्या

    बेल नंबर का उपयोग n एलिमेंट्स के एक सेट को उन सबसेट्स में पार्टीशन करने के तरीकों की संख्या को दर्शाने के लिए किया जाता है जो खाली नहीं हैं (यानी कम से कम एक एलिमेंट रखते हैं)। इस प्रोग्राम में, हमें n एलिमेंट्स का एक सेट दिया गया है और हमें सेट को नॉन-एम्प्टी सबसेट्स में पार्टीशन करने के तरीकों की

  1. - C++ में सेट बिट्स की संख्या के अनुसार ऐरे सॉर्ट करें

    यहां हम सेट-बिट्स के आधार पर ऐरे को सॉर्ट करने की एक दिलचस्प समस्या देखेंगे। जब ऐरे में किसी एलिमेंट में अधिक सेट-बिट्स होते हैं, तो उसे उस एलिमेंट से पहले रखा जाएगा जिसमें कम सेट बिट्स होते हैं। मान लीजिए कुछ नंबर्स हैं 12, 15, 7। तो सेट बिट्स मूल रूप से उनके बाइनरी प्रतिनिधित्व में 1s की संख्या है