מאי.16

בעיית הסכומים החלקיים

בעיית הסכומים החלקיים

נגיד יש מחסנים שיש להם במלאי מוצר מסוים. אנחנו צריכים לספק בדיוק כמות הנדרשת של המוצר (נגיד 20 מדפסות). נגיד במחסן ראשון יש 2 מדפסות ובמחסן חמישי יש 18 מדפסות - לכן יש להחזיר אותם בין המחסנים המתאימים. יש להחזיר רשימה של מחסנים שאנחנו נקח מהם את המוצר. כמובן, יכול להיות שיהיה יותר מצירוף אחד של מחסנים המתאימים.

  1. static void Main(string[] args)
  2. {
  3. const int target = 20;
  4. var numbers = new[] { 1, 2, 5, 8, 12, 14, 9, 21, 20 };
  5. var result = GetSubsets(numbers, target, "");
  6.  
  7. foreach (var subset in result)
  8. Console.WriteLine($"{subset} = {target}");
  9. Console.WriteLine($"Number of combinations: {result.Count()}");
  10. Console.ReadKey();
  11. }
  12.  
  13. static IEnumerable<string> GetSubsets(int[] set, int sum, string values)
  14. {
  15. for (int i = 0; i < set.Length; i++) {
  16. var left = sum - set[i];
  17. var vals = values != "" ? $"{set[i]} + {values}" : $"{set[i]}";
  18. if (left == 0) yield return vals;
  19. else {
  20. int[] possible = set.Take(i).Where(n => n <= sum).ToArray();
  21. if (possible.Length <= 0) continue;
  22. foreach (string s in GetSubsets(possible,left,vals))
  23. yield return s;
  24. }
  25. }
  26. }


שתף את הסיפור הזה:

תגובות(0)

השאירו תגובה

קפטצ'ה לא מתאימה

תגובה