इस तरह से एल्गोरिदम को समझने का प्रयास करें।
table[i][j]
मूल्य j
के लिए परिवर्तन करने के लिए पहले i
प्रकार के सिक्के का उपयोग करना है। तो:
table[i][j] = table[i-1][j] + table[i][j-S[i]]
जाहिर है जब j
सिक्के को बनाने, आपके पास दो विकल्प। ith सिक्का का उपयोग नहीं कर रहे हैं या ith सिक्का का उपयोग नहीं कर रहे हैं। Ith सिक्का का उपयोग नहीं करते समय, समाधान संख्या table[i-1][j]
है। Ith सिक्का का उपयोग करते समय, समाधान संख्या table[i][j-S[i]]
है, जिसका अर्थ है जेएस [i] मान बनाने के लिए पहले I सिक्के का उपयोग करना। इसलिए, कुल मिलाकर दोनों का योग है, जो table[i-1][j] + table[i][j-S[i]]
कोड में, आप लूप के लिए देखेंगे। बाहरी लूप I और आंतरिक लूप पर जेनरेट करते हैं। +=
कथन उपरोक्त समीकरण के आधार पर table[i][j]
की गणना करता है।
संपादित
table[j]
अपने कोड में वास्तव में table[i][j]
मैं ऊपर बात कर रहा हूँ और i
अपने पाश में मूल्य है। लूप table[N]
के बाद table[M][N]
का अर्थ है, M
सिक्कों का उपयोग करके, N
के लिए मूल्य बनाने के लिए सभी सिक्के हैं।
मैं और अधिक विस्तार कोड के आधार पर प्रदान करेगा:
for(int i=0; i<m; i++)
for(int j=S[i]; j<=n; j++)
table[j] += table[j-S[i]];
जब i = 0
, table[j]
पहले 1 सिक्के का उपयोग कर मूल्य j
के लिए परिवर्तन करने के लिए इसका मतलब है। उदाहरण के लिए, table[2]
अभी 2. तो के लिए परिवर्तन करने के लिए coins {1}
का उपयोग कर का अर्थ है:
table[1] = table[1] + table[1 - S[0]] = table[1] + table[0] = 1 + 0= 1
table[2] = table[2] + table[2 - S[0]] = table[2] + table[1] = 0 + 1= 1
table[3] = 1
table[4] = 1
उसके बाद, हम परिणाम मिल गया जब मैं = 0. table[1] ~ table[4]
अब मान 1, 2 के लिए परिवर्तन करने के लिए coin {1}
का उपयोग कर का मतलब है, 3, 4 अलग से।
जब मैं = 1, table[j]
का मतलब coin {1, 2}
का उपयोग j
के लिए परिवर्तन करने के लिए करता है।
table[2] = table[2] + table[2 - S[1]] = table[2] + table[0] = 1 + 1= 2
table[3] = table[3] + table[3 - S[1]] = 1 + 1 = 2
table[4] = table[4] + table[4 - S[1]] = table[4] + table[2] = 1 + 2 = 3
निम्न प्रक्रिया समान है।
अंत में, हम table[4]
ले जब i = 1
बाहर है और यह विश्लेषण:
table[4] = table[4] + table[4 - S[1]] = table[4] + table[2] = 1 + 2 = 3
यहाँ table[4]
बाईं तरफ के मूल्य हम गणना कर रहे हैं और वास्तव में यह table[i=1][4]
है। दाईं ओर table[4]
पिछले मान का प्रतिनिधित्व करता है और इस मामले में, table[i=0][4]
। यह विस्तार कर सकता है:
table[i=1][4] = table[i=0][4] + table[i=1][4 - S[1]]
समीकरण ठीक है
table[i][j] = table[i-1][j] + table[i][j-S[i]]
संपादित करें पालन-अप प्रश्न
आपको लगता है कि आप वास्तव में इस सवाल को समझते हैं, एक नए के साथ एक ही समस्या का समाधान करने का प्रयास करें बाधा। क्या होगा यदि हर सिक्का का उपयोग केवल एक बार किया जा सकता है? उदाहरण के लिए, एन = 4 और एस = {1,2,3}, केवल एक समाधान {1,3} ताकि आउटपुट 1 होना चाहिए। और एन = 10 और एस = {2, 5, 3, 6} के लिए, अभी भी केवल एक समाधान {2, 3, 5} और आउटपुट 1.
संकेत: मूल कोड का केवल एक पंक्ति परिवर्तन पर्याप्त है।
उत्तर: http://ideone.com/t1JnEz
तो इसके लिए एक क्रमबद्ध एस [] सही की आवश्यकता है? अन्यथा यह एस के लिए कैसे काम करता है जैसे {3,2,6,5,4} – Walt
सं। क्रमबद्ध एस की आवश्यकता नहीं है []। एल्गोरिदम के अंत में, तालिका [] में {3,2,6,5,4} और {2,3,4,5,6} के लिए समान मान होना चाहिए। – sunilnmu
क्या आप कृपया मुझे 6-6,2,4} पर सूखी दौड़ के साथ मदद कर सकते हैं .. एम इतनी उलझन में है :( – Walt