এখানে একটি C++ প্রোগ্রাম দেওয়া হলো একটি দিয়ে गये ইন্টিজারের সব ইউনিক পার্টিশন পেতে যেখানে পার্টিশনের যোগফল সেই ইন্টিজার হবে। এই প্রোগ্রামে, একটি পজিটিভ ইন্টিজার n দেওয়া আছে, এবং n কে পজিটিভ ইন্টিজারদের যোগফল হিসেবে রিপ্রেজেন্ট করার সব সম্ভাব্য ইউনিক উপায় জেনারেট করতে হবে।
অ্যালগরিদম
শুরু
function displayAllUniqueParts(int m):
একটি পার্টিশন স্টোর করার জন্য একটি অ্যারে ডিক্লেয়ার করুন p[m]।
একটি পার্টিশনে লাস্ট এলিমেন্টের ইনডেক্স k কে ০ সেট করুন
প্রথম পার্টিশন ইনিশিয়ালাইজ করুন নম্বরটি নিজেই হিসেবে, p[k]=m
একটি হুইল লুপ তৈরি করুন যা প্রথম করেন্ট পার্টিশন প্রিন্ট করবে, তারপর পরবর্তী পার্টিশন জেনারেট করবে। লুপ থামবে যখন করেন্ট পার্টিশনে সব ১ থাকবে।
করেন্ট পার্টিশন ডিসপ্লে করুন displayArray(p, k + 1) দিয়ে।
পরবর্তী পার্টিশন জেনারেট করুন:
val=0 ইনিশিয়ালাইজ করুন।
p[]-এ রাইটমোস্ট নন-ওয়ান ভ্যালু খুঁজুন। এছাড়া val আপডেট করুন যাতে জানা যায় কতটুকু ভ্যালু একোমোডেট করা যাবে।
If k < 0,
সব ভ্যালু ১ তাই আর কোনো পার্টিশন নেই
উপরে পাওয়া p[k] ডিক্রিজ করুন এবং val অ্যাডজাস্ট করুন।
If val বেশি হয়,
তবে সর্টেড অর্ডার ভাঙবে। val কে p[k] আকারের বিভিন্ন ভ্যালুতে ভাগ করুন এবং এই ভ্যালুগুলো p[k]-র পরে বিভিন্ন পজিশনে কপি করুন।
val কে পরবর্তী পজিশনে কপি করুন এবং পজিশন ইনক্রিমেন্ট করুন।
শেষ
উদাহরণ কোড
#include<iostream>
using namespace std;
void printArr(int p[], int m) {
for (int i = 0; i < m; i++)
cout << p[i] << " ";
cout << endl;
}
void printAllUniqueParts(int m) {
int p[m];
int k = 0;
p[k] = m;
while (true) {
printArr(p, k + 1);
int rem_val = 0;
while (k >= 0 && p[k] == 1) {
rem_val += p[k];
k--;
}
if (k < 0)
return;
p[k]--;
rem_val++;
while (rem_val > p[k]) {
p[k + 1] = p[k];
rem_val = rem_val - p[k];
k++;
}
p[k + 1] = rem_val;
k++;
}
}
int main() {
cout << "All Unique Partitions of 3\n";
printAllUniqueParts(3);
cout << "\nAll Unique Partitions of 4\n";
printAllUniqueParts(4);
cout << "\nAll Unique Partitions of 5\n";
printAllUniqueParts(5);
return 0;
}
আউটপুট
All Unique Partitions of 3 3 2 1 1 1 1 All Unique Partitions of 4 4 3 1 2 2 2 1 1 1 1 1 1 All Unique Partitions of 5 5 4 1 3 2 3 1 1 2 2 1 2 1 1 1 1 1 1 1 1