दिलचस्प जवाब। पॉइंटर्स को विकिपीडिया के लिए धन्यवाद - दिलचस्प होने पर - वे वास्तव में समस्या को हल नहीं करते हैं क्योंकि जैसा कि मैं सटीक मैचों की तलाश में था - परंपरागत बिन-पैकिंग/नापसैक समस्या की तुलना में एक लेखांकन/पुस्तक ब्लॉसिंग समस्या का अधिक।
मैं ब्याज के साथ स्टैक ओवरफ़्लो के विकास का अनुसरण कर रहा हूं और सोच रहा हूं कि यह कितना उपयोगी होगा। यह समस्या काम पर आई और मुझे आश्चर्य हुआ कि क्या स्टैक ओवरफ्लो एक तैयार किए गए उत्तर (या एक बेहतर उत्तर) प्रदान कर सकता है जितना जल्दी मैं इसे लिख सकता हूं। टिप्पणियों के लिए भी धन्यवाद कि यह होमवर्क टैग किया गया है - मुझे लगता है कि उपर्युक्त के प्रकाश में उचित रूप से सटीक है।
public class Solver {
private List<List<decimal>> mResults;
public List<List<decimal>> Solve(decimal goal, decimal[] elements) {
mResults = new List<List<decimal>>();
RecursiveSolve(goal, 0.0m,
new List<decimal>(), new List<decimal>(elements), 0);
return mResults;
}
private void RecursiveSolve(decimal goal, decimal currentSum,
List<decimal> included, List<decimal> notIncluded, int startIndex) {
for (int index = startIndex; index < notIncluded.Count; index++) {
decimal nextValue = notIncluded[index];
if (currentSum + nextValue == goal) {
List<decimal> newResult = new List<decimal>(included);
newResult.Add(nextValue);
mResults.Add(newResult);
}
else if (currentSum + nextValue < goal) {
List<decimal> nextIncluded = new List<decimal>(included);
nextIncluded.Add(nextValue);
List<decimal> nextNotIncluded = new List<decimal>(notIncluded);
nextNotIncluded.Remove(nextValue);
RecursiveSolve(goal, currentSum + nextValue,
nextIncluded, nextNotIncluded, startIndex++);
}
}
}
}
:
जो लोग रुचि रखते हैं के लिए, यहाँ मेरी समाधान जो प्रत्यावर्तन (स्वाभाविक रूप से) का उपयोग करता है मैं भी बल्कि [] [] वापसी प्रकार के रूप में दिया गया दशमलव से> विधि हस्ताक्षर के बारे में अपना मन बदल और सूची के लिए चला गया है
यदि आप किसी एप्लिकेशन इस काम करता है परीक्षण करना चाहते हैं, इस कंसोल अनुप्रयोग कोड का प्रयास करें:
class Program {
static void Main(string[] args) {
string input;
decimal goal;
decimal element;
do {
Console.WriteLine("Please enter the goal:");
input = Console.ReadLine();
}
while (!decimal.TryParse(input, out goal));
Console.WriteLine("Please enter the elements (separated by spaces)");
input = Console.ReadLine();
string[] elementsText = input.Split(' ');
List<decimal> elementsList = new List<decimal>();
foreach (string elementText in elementsText) {
if (decimal.TryParse(elementText, out element)) {
elementsList.Add(element);
}
}
Solver solver = new Solver();
List<List<decimal>> results = solver.Solve(goal, elementsList.ToArray());
foreach(List<decimal> result in results) {
foreach (decimal value in result) {
Console.Write("{0}\t", value);
}
Console.WriteLine();
}
Console.ReadLine();
}
}
मुझे आशा है कि इस मदद करता है किसी और अधिक तेजी से उनके जवाब पाने (होमवर्क के लिए या अन्यथा)।
चीयर्स ...
स्रोत
2008-09-17 15:00:49
एक रिकर्सिव समाधान लम्बाई 1/3 और 3 गुना अधिक सुरुचिपूर्ण होगा। – Haoest
यह एक पुनरावर्ती समाधान है। मुझे आपकी समाधान देखने में दिलचस्पी होगी जो 1/3 लंबाई है। शायद आपको टिप्पणी करने से पहले समाधान की जांच करनी चाहिए? –
सटीक मिलान निकटतम मैच हैं। यदि निकटतम मैच सटीक मिलान नहीं है, तो कोई सटीक मिलान नहीं है। – wnoise