কম্পিউটার টিউটোরিয়াল

C++-এ একটি সেটকে k সাবসেটে ভাগ করার পদ্ধতির সংখ্যা গণনা


দুটি সংখ্যা e এবং p দেওয়া আছে। লক্ষ্য হলো e টি এলিমেন্টवाले একটি সেটকে p টি পার্টিশন/সাবসেটে ভাগ করার পদ্ধতির সংখ্যা বের করা।

উদাহরণ ১

ইনপুট

e=4 p=2

আউটপুট

একটি সেটকে k সাবসেটে ভাগ করার পদ্ধতির সংখ্যা: 7

ব্যাখ্যা

যদি এলিমেন্টগুলো হয়: a b c d তবে ২টি পার্টিশনে ভাগ করার পদ্ধতিগুলো: (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)। মোট ৭টি পদ্ধতি।

উদাহরণ ২

ইনপুট

e=2 p=2

আউটপুট

একটি সেটকে k সাবসেটে ভাগ করার পদ্ধতির সংখ্যা: 1

ব্যাখ্যা

যদি এলিমেন্টগুলো হয়: a b তবে ২টি পার্টিশনে ভাগ করার পদ্ধতি: (a)-(b)। মাত্র ১টি পদ্ধতি।

প্রয়োগ করা পদ্ধতি

এই পদ্ধতিতে ডাইনামিক প্রোগ্রামিং ব্যবহার করা হয়। সমাধানে ব্যবহৃত গণনাগুলো রিকার্সিভ হয়। যদি e-1 টি এলিমেন্ট p টি পার্টিশনে ways(e-1,p) পদ্ধতিতে ভাগ করা যায়, তবে বর্তমান এলিমেন্টটি সেসব p টি পার্টিশনের যেকোনো একটিয় রাখলে p*ways(e-1,p) পদ্ধতি হবে।

যদি e-1 টি এলিমেন্ট p-1 টি পার্টিশনে ways(e-1,p-1) পদ্ধতিতে ভাগ করা যায়, তবে ১টি এলিমেন্ট আলাদা ১টি পার্টিশনে রাখলে 1*ways(e-1,p-1) পদ্ধতি হবে। মোট পদ্ধতি = p*ways(e-1,p) + ways(e-1,p-1)। এই পদ্ধতিটি রিকার্সিভ হয়ে যাবে।

উপরের চিত্রে দেখা যাচ্ছে ডুপ্লিকেট গণনা হচ্ছে। এটা এড়াতে ডাইনামিক প্রোগ্রামিং ব্যবহার করা হয়।

  • ভেরিয়েবল elements এবং partition ইনপুট নিন।

  • partition_k(int elements, int partition) ফাংশনটি পদ্ধতির সংখ্যা রিটার্ন করে।

  • ২D অ্যারে arr[elements + 1][partition + 1] নিন ways(e,p) এর মান arr[e][p]-এ রাখার জন্য।

  • for লুপ দিয়ে i=0 থেকে i=elements পর্যন্ত arr[i][0] = 0 সেট করুন কারণ পার্টিশন ০ হলে পদ্ধতি ০।

  • আরেক for লুপ দিয়ে j=0 থেকে j=partition পর্যন্ত arr[0][j] = 0 সেট করুন কারণ এলিমেন্ট ০ হলে পদ্ধতি ০।

  • এখন দুটি নেস্টেড for লুপ দিয়ে i=1 থেকে i<=elements এবং j=1 থেকে j<=i পর্যন্ত বাকি মানগুলো পূরণ করুন।

  • একক এলিমেন্টের জন্য পদ্ধতি ১, অথবা x এলিমেন্টকে x পার্টিশনে ভাগ করলে মাত্র ১ পদ্ধতি। তাই i==j অথবা j==1 হলে arr[i][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] রিটার্ন করুন ফলাফল হিসেবে।

উদাহরণ কোড

#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. সি++-এ আয়তক্ষেত্রে বর্গের সংখ্যা গণনা

  2. C++-এ Partition to K Equal Sum Subsets

  3. C++-এ বেল নাম্বার - সেট পার্টিশনের الطرق সংখ্যা

  4. C++-এ সেট বিট কাউন্ট অনুযায়ী অ্যারে সর্ট করা