Изучающий
1 / 0 / 2
Регистрация: 22.01.2017
Сообщений: 115
1

Добиться минимальной разницы между запрашиваемым числом и суммой чисел в StringGrid

02.04.2019, 23:08. Показов 401. Ответов 3

Здравствуйте. Подскажите, пожалуйста, алгоритм (или код, как можете) решения следующий задачи (правильнее будет сказать проблемы):

Имеет таблица StringGrid, которая заполняется из файла
Добиться минимальной разницы между запрашиваемым числом и суммой чисел в StringGrid

Также имеется поле Edit1, в которое вводят число. Задача такая: Продаются рулоны (допустим обоев) разного метража. Сами рулоны одинаковые, отличаются лишь метражом. Есть рулоны по 22 метра, есть по 45 метров и т.д. Пользователь вводит необходимое ему число метров, а программа, исходя из того что имеется в таблице StringGrid1, рассчитать, сколько и каких рулонов надо дать "покупателю", чтобы их суммарная длина была не меньше запрошенной, а отклонение от заказанной длины было минимальным.
Сама проблема в том, что я не знаю как даже вручную рассчитать, сколько каких рулонов надо, чтобы разница между запрошенной длиной и тем что можно составить из этих рулонов была минимальна. Сначала думал идти из большего и постоянно уменьшать метраж рулона:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
procedure TForm1.Button1Click(Sender: TObject);
var
  num, min, max, tek, need, res: integer;
  b: array of array of integer;
  i, j: Integer;
begin
  num:=StrToInt(Edit1.Text);
  res:=num;
 
  Memo2.Text:='';
  while res>0 do
  begin
    min:=999999999;
    max:=0;
    tek:=0;
    need:=0;
    for i := 1 to StringGrid1.RowCount-1 do
    begin
      tek:=StrToInt(StringGrid1.Cells[1,i]);
      if (tek>max) and (tek<=res) then
        max:=tek;
      if (tek<min)  then
        min:=tek;
    end;
    if max=0 then
      need:=min
    else
      need:=max;
    res:=res-need;
    Memo2.Lines.Add(IntToStr(res+need)+'-'+IntToStr(need)+'='+IntToStr(res));
  end;
 
  ShowMessage(IntToStr(0-res));
end;
Всё бы ничего, считает. Возьмём допустим как пример, что пользователь ввёл 121 метр.
Метражи рулонов такие (могут быть другие, достаются из файла):
27 метров
45 метров
33 метра
60 метров
22 метра
47 метров
По ходу программы он выполняет действия:
1) 121-60=61
2) 61-60=1
3) 1-22=-21
Вроде кажется, что 21 метр это минимальное отклонение от указанного метража, но нет. Если, например, взять 45 метров + 60 метров + 22 метра получится 127 метров (-121 = 6 метров разницы). Я ещё не уверен что это минимальная разница, просто взял случайные рулоны и сложил.
Задача ещё усложняется, что разных рулонов разное количество на "складе", но мне пока хотя бы с бесконечными рулонами решить бы...
Подскажите, пожалуйста, или алгоритм, или код, я уже не знаю просто как, не один час ломаю голову
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.04.2019, 23:08
Ответы с готовыми решениями:

Вычисление разницы между 4-значным числом и числом, записанным в зеркальном порядке
Вычисление разницы между 4-значным числом и числом, записанным в зеркальном порядке. помогите

Найти пару чисел с минимальной суммой и разницей между ними не меньше 4
Привет, народ. Сегодня запоролся на одной задаче из ЕГЭ. Суть такая: нам вводится количество чисел...

Найти разность между суммой четных и минимальных числом из введенных чисел (с блок схемой)
Задача- Вводятся числа. Конец ввода-0. Найти разность между суммой четных и минимальных числом из...

Функция должна вычислять разницы между суммой положительных элементов массива и суммой модулей отрицательных элементов массива
Разработать функцию ,обрабатывающую массив и вычисляющую две величины.Кроме того,разработать две...

3
5657 / 2258 / 464
Регистрация: 20.11.2009
Сообщений: 7,597
Записей в блоге: 1
02.04.2019, 23:11 2
Цитата Сообщение от Jebvo Посмотреть сообщение
Здравствуйте. Подскажите, пожалуйста, алгоритм (или код, как можете) решения следующий задачи (правильнее будет сказать проблемы):
проблема в общем виде называется "задача о рюкзаке", загугливаем эти два слова
1
Изучающий
1 / 0 / 2
Регистрация: 22.01.2017
Сообщений: 115
02.04.2019, 23:34  [ТС] 3
Цитата Сообщение от Arcor Посмотреть сообщение
"задача о рюкзаке", загугливаем эти два слова
Посмотрю, отпишусь

Добавлено через 20 минут
Цитата Сообщение от Jebvo Посмотреть сообщение
Посмотрю, отпишусь
Вообщем, буду разбираться, если что то не пойму, отпишу сюда, а так спасибо
0
5657 / 2258 / 464
Регистрация: 20.11.2009
Сообщений: 7,597
Записей в блоге: 1
02.04.2019, 23:43 4
Цитата Сообщение от Jebvo Посмотреть сообщение
если что то не пойму, отпишу сюда
так точно Сэр, а спать пойти то можно?
Цитата Сообщение от Jebvo Посмотреть сообщение
а так спасибо
да так, не за что
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.04.2019, 23:43
Помогаю со студенческими работами здесь

Расчёт разницы между датами в StringGrid
Доброго времени, помогите пожалуйста с расчётами. Имеется StringGrid c данными. Фото ниже. При...

В двумерном N*K массиве целых чисел поменять строку с максимальной суммой элементов со строкой с минимальной суммой элементов.
Массив заполнять случайными числами, кроме случаев, когда это нецелесообразно (прогрессия,...

В файле определить разность между максимальной и минимальной суммой кредита
Помогите с заданием В файле определить разность между максимальной и минимальной суммой кредита...

Найти пару чисел с минимальной суммой
программа должна выводить в какой паре чисел минимальная сумма.. почему не работает: #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru