ধরুন আমাদের সংখ্যার একটি সেট আছে; আমাদের সেই সেটের সমস্ত সম্ভাব্য উপসেট তৈরি করতে হবে। এটি পাওয়ার সেট নামেও পরিচিত। আমাদের মনে রাখতে হবে উপাদানগুলো সদৃশ হতে পারে। সুতরাং সেটটি যদি [1,2,2] এর মত হয় তবে পাওয়ার সেটটি হবে [[], [1], [2], [1,2], [2,2], [1,2,2] ]]
আসুন ধাপগুলো দেখি -
- একটি অ্যারের রেস এবং x নামক আরেকটি সেট সংজ্ঞায়িত করুন
- আমরা পুনরাবৃত্তিমূলক পদ্ধতি ব্যবহার করে এটি সমাধান করব। তাই যদি পুনরাবৃত্ত পদ্ধতির নাম বলা হয় solve(), এবং এটি সূচক, একটি অস্থায়ী অ্যারে এবং সংখ্যার অ্যারে (সংখ্যা) নেয়
- সলভ() ফাংশন নিচের মত কাজ করবে -
- যদি সূচক =v এর আকার, তাহলে
- যদি x-এ temp উপস্থিত না থাকে, তাহলে res-এ temp সন্নিবেশ করান এবং x-এ temp সন্নিবেশ করান
- প্রত্যাবর্তন
- কল সমাধান (index + 1, temp, v)
- টেম্পে v[index] ঢোকান
- কল সমাধান (index + 1, temp, v)
- টেম্প থেকে শেষ উপাদানটি সরান
- প্রধান ফাংশনটি নিচের মত হবে -
- res এবং x সাফ করুন, এবং প্রদত্ত অ্যারে সাজান, একটি অ্যারের তাপমাত্রা সংজ্ঞায়িত করুন
- কল সমাধান (0, টেম্প, অ্যারে)
- রেস অ্যারে সাজান এবং রিটার্ন রিটার্ন করুন
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
#includeনেমস্পেস ব্যবহার করে std;void print_vector(vector > v){ cout <<"["; for(int i =0; i > res; সেট <ভেক্টর > x; স্ট্যাটিক বুল cmp(ভেক্টর a, ভেক্টর b){ ফেরত a temp, vector &v){ if(idx ==v.size()){ if(x.find(temp) ==x.end()){ res .push_back(temp); x.insert(temp); } প্রত্যাবর্তন; } সমাধান (idx+1, temp, v); temp.push_back(v[idx]); সমাধান (idx+1, temp, v); temp.pop_back(); } ভেক্টর<ভেক্টর > সাবসেট উইথডুপ(ভেক্টর &a) { res.clear(); x.clear(); sort(a.begin(), a.end()); ভেক্টর temp; সমাধান (0, temp, a); sort(res.begin(), res.end(), cmp); রিটার্ন রেস; }};প্রধান(){সমাধান ob; ভেক্টর v ={1,2,2}; print_vector(ob.subsetsWithDup(v));}
ইনপুট
[1,2,2]