Распределить множество значений по строкам массива с учётом ограничения - C#

Узнай цену своей работы

Формулировка задачи:

Доброе время суток! Помогите пожалуйста с разработкой алгоритма: Нужно из одномерного массива значений, например: 1050/2000/2050/2050/1050 Распределить эти значения по строкам матрицы (как вариант в ступенчатый массив), учитывая что сумма этих значений в строке не должна превышать заданного значения (скажем 4200). Так вот, как это сделать программно? В ручную делаю так: Массив: 1050/2000/2050/2050/1050 Ограничение = 4200 Тогда расчёт таким образом: 1050 + 1050 +2050 = 4150 -> минимальный остаток 50 использованные ранее значения из массива удаляем и не учитываем при дальнейших расчётах 2000 + 2050 = 4050 -> мин. остаток из оставшихся элементов 150 Т.е. матрица плана: 1050, 1050, 2050 2000, 2050 Помогите пожалуйста перевести в программный код, а то и на рекурсию думал и на перебор значений но не выходит.

Решение задачи: «Распределить множество значений по строкам массива с учётом ограничения»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4.  
  5. namespace ConsoleApplication9
  6. {
  7.     class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             int max = 0;
  12.             int[] ar = { 1050,2000,2050,2050,1050};
  13.             bool flag = true;
  14.             int count = 0;
  15.             //проверка на корректный максимум
  16.             while (flag)
  17.             {
  18.                 Console.WriteLine("Введите максимум: ");
  19.                 max = int.Parse(Console.ReadLine());
  20.                 var a = ar.GroupBy(x => x > max);
  21.                 foreach (var val in a)
  22.                 {
  23.                     if(val.Key)
  24.                     count = val.Count();
  25.                 }
  26.  
  27.                 if (count > 0)
  28.                 {
  29.                     Console.WriteLine("Найдено {0} элементов превышающих максимум ", count);
  30.                     count = 0;
  31.                 }
  32.                 else
  33.                     flag = false;
  34.             }
  35.             //находим максимальный элемент
  36.             List<List<int>> list = new List<List<int>>();
  37.  
  38.             while (ar.Length > 0)
  39.             {
  40.                 flag = false;
  41.                 List<int> l = new List<int>();
  42.                 int maxInAr = ar.Max();
  43.                 int minInAr = ar.Min();
  44.                 int result = max - maxInAr;
  45.                 count = 0;//добавил счётчик
  46.                 while (result >= minInAr)
  47.                 {
  48.                     flag = true;
  49.                     if (count == 0)//максимальный элемент записывается только на входе
  50.                     {
  51.                         l.Add(maxInAr);
  52.                         ar = ResizeAr(ar, maxInAr);
  53.                     }
  54.                     count++;
  55.                     var newAr = ar.Where(x => x <= result).OrderBy(x => x);
  56.                     if (newAr.Count() > 0)
  57.                     {
  58.                         int newMax = newAr.Max();
  59.                         l.Add(newMax);
  60.                         result -= newMax;
  61.                         if (result < minInAr)
  62.                         {
  63.                             list.Add(l);
  64.                         }
  65.                         ar = ResizeAr(ar, newMax);//а тут вынес из if, т.к. ресайзить нужно и промежуточные результаты
  66.                     }
  67.                     else { list.Add(l); break; }
  68.                 }
  69.                 count = 0;
  70.                 if (result < minInAr &!flag)
  71.                 {
  72.                     l.Add(maxInAr);
  73.                     list.Add(l);
  74.                     ar = ResizeAr(ar, maxInAr);
  75.                 }
  76.             }
  77.  
  78.             Console.WriteLine("Результат \n");
  79.             foreach (List<int> s in list)
  80.             {
  81.                 string str = "[";
  82.                 foreach (int i in s)
  83.                     str += i.ToString() + ",";
  84.                 str = str.Substring(0, str.Length - 1) + "]";
  85.                 Console.WriteLine(str);
  86.             }
  87.             Console.ReadKey();
  88.         }
  89.         static int[] ResizeAr(int[] ar, int el)
  90.         {
  91.             if (ar.Length > 0)
  92.             {
  93.                 int ind = Array.FindIndex(ar, x => x == el);
  94.                 if (ind < 0)
  95.                     return ar;
  96.                 Array.Clear(ar, ind, 1);
  97.                 Array.Sort(ar);
  98.                 Array.Reverse(ar);
  99.                 Array.Resize(ref ar, ar.Length - 1);
  100.             }
  101.             return ar;
  102.         }
  103.     }
  104. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.1 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы