בעיית הסכומים החלקיים
נגיד יש מחסנים שיש להם במלאי מוצר מסוים. אנחנו צריכים לספק בדיוק כמות הנדרשת של המוצר (נגיד 20 מדפסות). נגיד במחסן ראשון יש 2 מדפסות ובמחסן חמישי יש 18 מדפסות - לכן יש להחזיר אותם בין המחסנים המתאימים. יש להחזיר רשימה של מחסנים שאנחנו נקח מהם את המוצר. כמובן, יכול להיות שיהיה יותר מצירוף אחד של מחסנים המתאימים.
- static void Main(string[] args)
- {
- const int target = 20;
- var numbers = new[] { 1, 2, 5, 8, 12, 14, 9, 21, 20 };
- var result = GetSubsets(numbers, target, "");
- foreach (var subset in result)
- Console.WriteLine($"{subset} = {target}");
- Console.WriteLine($"Number of combinations: {result.Count()}");
- Console.ReadKey();
- }
- static IEnumerable<string> GetSubsets(int[] set, int sum, string values)
- {
- for (int i = 0; i < set.Length; i++) {
- var left = sum - set[i];
- var vals = values != "" ? $"{set[i]} + {values}" : $"{set[i]}";
- if (left == 0) yield return vals;
- else {
- int[] possible = set.Take(i).Where(n => n <= sum).ToArray();
- if (possible.Length <= 0) continue;
- foreach (string s in GetSubsets(possible,left,vals))
- yield return s;
- }
- }
- }