2011-01-03 24 views
14

कहें एस = 5 और एन = 3 कहें समाधान देखेंगे - < 0,0,5> < 0,1,4> < 0,2,3 > < 0,3,2> < 5,0,0> < 2,3,0> < 3,2,0> < 1,2,2> आदि आदिएन संख्या

सामान्य स्थिति में, एन नेस्ट लूप का उपयोग समस्या को हल करने के लिए किया जा सकता है। एन नेस्टेड लूप चलाएं, उनके अंदर जांचें कि क्या लूप वैरिएबल एस

यदि हम समय से पहले नहीं जानते हैं, तो हम एक रिकर्सिव समाधान का उपयोग कर सकते हैं। प्रत्येक स्तर पर, 0 से एन तक शुरू होने वाला लूप चलाएं और फिर फ़ंक्शन को दोबारा कॉल करें। जब हम एन की गहराई तक पहुंचते हैं, तो देखें कि प्राप्त संख्या एस

कोई अन्य गतिशील प्रोग्रामिंग समाधान है?

+1

क्या यह होमवर्क है? – templatetypedef

+1

डुप्लिकेट (math.stackexchange पर): http://math.stackexchange.com/questions/2455/geometric-proof-of-the-formula-for-simplex-numbers –

+0

गतिशील प्रोग्रामिंग समाधान उस से बहुत अलग नहीं है क्लासिक [0-1 knapsack समस्या] (http://en.wikipedia.org/wiki/Knapsack_problem#0-1_knapsack_problem)। अंतर यह है कि हम केवल पूर्ण knapsacks (समाधान में मामूली परिवर्तन) में रुचि रखते हैं और जिनमें वास्तव में एन आइटम (समाधान में मामूली परिवर्तन) शामिल हैं। – marcog

उत्तर

8

इस पुनरावर्ती क्रिया का प्रयास करें:

f(s, n) = 1         if s = 0 
     = 0         if s != 0 and n = 0 
     = sum f(s - i, n - 1) over i in [0, s] otherwise 

गतिशील प्रोग्रामिंग का उपयोग करने के आप इसे मूल्यांकन करने के बाद च के मूल्य को कैश कर सकते, और देखें कि क्या मूल्य पहले से ही मूल्यांकन करने से पहले कैश में मौजूद है। (- 1, एन एस + एन)

उन संख्याओं सिंप्लेक्स संख्या हैं द्विपद:

+1

कैशिंग ज्ञापन है, डीपी नहीं। – marcog

+15

@marcog: कैशिंग गतिशील प्रोग्रामिंग का एक उदाहरण है। इसे शीर्ष-डाउन गतिशील प्रोग्रामिंग कहा जाता है। यहां "memoize" के लिए खोजें: http://en.wikipedia.org/wiki/Dynamic_programming –

+1

विकिपीडिया का उद्धरण न दें। :) दोनों संबंधित हैं, लेकिन ज्ञापन डीपी नहीं है। – marcog

0

देखें यह वास्तव में, एक हनोई के टावर्स समस्या की तरह एक बहुत लग रहा है केवल बड़े डिस्क पर डिस्क स्टैकिंग की बाधा के बिना। आपके पास एस डिस्क हैं जो एन टावरों पर किसी भी संयोजन में हो सकती हैं। तो यही कारण है कि मैं इसके बारे में सोच रहा था।

मुझे संदेह है कि एक सूत्र है जिसे हम घटा सकते हैं जिसके लिए पुनरावर्ती प्रोग्रामिंग की आवश्यकता नहीं है। हालांकि मुझे थोड़ा और समय चाहिए।

+0

सूत्र के लिए मेरा उत्तर देखें। –

3

यह O(s+n)में गणना की जा सकती निम्नलिखित तरीके से (या O(1) अगर आप एक approximation कोई आपत्ति नहीं है):

कल्पना कीजिए हम साथ में यह n-1 एक्स के और s ओ के एक स्ट्रिंग है। तो रों = 5, n = 3, के अपने उदाहरण के लिए एक उदाहरण स्ट्रिंग होगा

oXooXoo 

सूचना है कि एक्स के तीन अलग-अलग समूहों में ओ के विभाजित: लंबाई 1, लंबाई 2 में से एक है, और लंबाई 2. इस < 1,2,2> के आपके समाधान से मेल खाता है। (उदाहरण के लिए, XoooooX को < 0,5,0> अनुरूप होगा एक 0 संभव है) हर संभव स्ट्रिंग हमें एक अलग समाधान, एक पंक्ति में ओ के की संख्या की गणना देता है। तो इस फ़ॉर्म के संभावित तारों की संख्या गिनकर, हमें आपके प्रश्न का उत्तर मिल जाता है।

s+(n-1) पदों s ओ के लिए चुनने के लिए हैं, तो उत्तर Choose(s+n-1, s) है।

+0

क्या होगा यदि आपके पास से चुनने के लिए सभी रेंज [0..s] नहीं है? क्या होगा यदि आपके पास ए और बी भी है और रकम में उपयोग की जाने वाली सभी संख्याएं [ए..बी] से आती हैं? एस = 5 और एन = 3 और ए = 1 और बी = 4 के लिए, परिणाम <1,1,3><1,2,2><1,3,1><2,1,2><2,2,1> और <3,1,1> कुल 6 के साथ होंगे .. क्या इसके लिए कोई सूत्र है? –

4

मैं इसके लिए अपने खुद के सूत्र है। हम, मेरे दोस्त गियो के साथ मिलकर इस बारे में एक जांच रिपोर्ट बना दी।हमें प्राप्त सूत्र [2 raised to (n-1) - 1] है, जहां एन वह संख्या है जिसे हम देख रहे हैं कि इसमें कितने जोड़ हैं।

आइए प्रयास करें।

  • यदि एन 1 है: इसके जोड़ ओ हैं। कोई दो या अधिक संख्याएं नहीं हैं जिन्हें हम 1 का योग प्राप्त करने के लिए जोड़ सकते हैं (0 को छोड़कर)। आइए उच्च संख्या आज़माएं।
  • चलिए कोशिश करें 4. 4 has addends: 1+1+1+1, 1+2+1, 1+1+2, 2+1+1, 1+3, 2+2, 3+1। इसका कुल 7. चलो सूत्र के साथ जांचें। 2 को बढ़ाया (4-1) - 1 = 2 उठाया गया (3) - 1 = 8-1 = 7।
  • आइए प्रयास करें 15. 2 उठाए गए (15-1) - 1 = 2 को बढ़ाया गया (14) - 1 = 16384 - 1 = 16383. इसलिए, 16383 तरीके हैं जो संख्याओं को जोड़ने के लिए हैं।

(नोट: addends सकारात्मक संख्या रहे हैं केवल।)

(आप हमारे सूत्र सही है या नहीं की जाँच करने के अन्य नंबरों की कोशिश कर सकते हैं।)

+0

यह सहायक है लेकिन मुझे लगता है कि प्रश्न x संख्याओं के साथ 4 में जोड़ने के बारे में था। तो केवल 1,2,1 एक्स = 3 के लिए एक समाधान होगा – user3475234

0

एक निश्चित सूत्र जवाब खोजने के लिए नहीं है । यदि आप आर तत्वों के योग के रूप में एन प्राप्त करने के तरीकों की संख्या खोजना चाहते हैं। उत्तर हमेशा होता है: (एन + आर -1)!/((आर -1)! * (एन)!) या दूसरे शब्दों में: (एन + आर -1) सी (आर -1)

संबंधित मुद्दे