एक सीधा तरीका एक पुनरावर्ती प्रक्रिया है जो प्रत्येक आह्वान पर निम्नलिखित कार्य करता है। प्रक्रिया का इनपुट जोड़े की एक सूची है जो पहले से ही चुनी गई है और सभी जोड़े की सूची है।
- इनपुट सूची द्वारा पहले से कवर नहीं की गई सबसे छोटी संख्या की गणना करें। पहले आह्वान के लिए, यह निश्चित रूप से 0 होगा, क्योंकि किसी भी जोड़े को नहीं चुना गया है।
- यदि सभी नंबर कवर किए गए हैं, तो आपके पास एक सही संयोजन है, इसे प्रिंट करें और पिछले चरण को वापस करें। अन्यथा, जिस छोटी संख्या को उजागर किया जाता है वह वह लक्ष्य है जिसके लिए हम लक्ष्य करेंगे।
- लक्ष्य संख्या को कवर करने के तरीके की तलाश में जोड़े के माध्यम से खोजें। यदि कोई नहीं है, तो बस पिछले स्तर की पुनरावृत्ति पर वापस लौटें।
- यदि लक्ष्य संख्या को कवर करने का एक तरीका है, तो पहले तरीके को चुनें और पुन: पूरी प्रक्रिया को फिर से कॉल करें, जोड़ी के साथ चुने हुए जोड़े की सूची में सिर्फ जोड़ा गया।
- जब वह वापस आए, तो पहले चुने गए जोड़े को ओवरलैप किए बिना, एक जोड़ी के साथ लक्ष्य संख्या को कवर करने का अगला तरीका देखें। यदि आप एक पाते हैं, तो इसे चुनें और फिर से अगली प्रक्रिया को पुन: कॉल करें।
- चरण 4 और 5 तब तक जारी रखें जब तक कि लक्ष्य संख्या को कवर करने के लिए और अधिक तरीके न हों। जोड़े की पूरी सूची के माध्यम से जाओ। जब अधिक सही विकल्प नहीं होते हैं, तो पुनरावृत्ति के पिछले स्तर पर लौटें।
इस एल्गोरिथ्म की कल्पना करने का तरीका एक पेड़ के साथ है, जिसके रास्ते गैर-अतिव्यापी जोड़े के अनुक्रम हैं। पेड़ के पहले स्तर में सभी जोड़े होते हैं जिनमें 0. होते हैं। ऊपर के उदाहरण के लिए, पेड़ है
जड़
|
----------------
| | |
(0,1) (0,2) (0,3)
| | |
(2,3) (1,3) (1,2)
इस उदाहरण में पेड़ के माध्यम से सभी रास्ते वास्तव में सही संग्रह देते हैं, लेकिन उदाहरण के लिए अगर हमने जोड़ी (1,2) को छोड़ दिया तो सबसे सही रास्ते में केवल एक नोड होगा और चरण 3 में खोज के अनुरूप होगा।
इस प्रकार के खोज एल्गोरिदम को किसी विशेष प्रकार की सभी वस्तुओं की गणना की कई समान समस्याओं के लिए विकसित किया जा सकता है।
यह सुझाव दिया गया था कि शायद ओपी का मतलब था कि सभी जोड़े इनपुट में हैं, न कि उनमें से केवल एक सेट जैसा कि सवाल कहता है। उस स्थिति में एल्गोरिथ्म बहुत आसान है क्योंकि यह जांचना आवश्यक नहीं है कि कौन से जोड़े की अनुमति है। सभी जोड़े के सेट को उत्पन्न करना भी आवश्यक नहीं है; निम्नलिखित pseudocode वही करेगा जो ओपी ने पूछा था। यहाँ इनपुट संख्या है, "सूची" एक खाली सूची के रूप में शुरू होती है, और "कवर" 0. के लिए प्रारंभ की गई लंबाई की एक सरणी है। इसे कुछ और अधिक कुशल बनाया जा सकता है लेकिन यह मेरा तत्काल लक्ष्य नहीं है।nnn
sub cover {
i = 0;
while ( (i < n) && (covered[i] == 1 )) {
i++;
}
if ( i == n ) { print list; return;}
covered[i] = 1;
for ( j = 0; j < n; j++ ) {
if ( covered[j] == 0 ) {
covered[j] = 1;
push list, [i,j];
cover();
pop list;
covered[j] = 0;
}
}
covered[i] = 0;
}