Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.11.2009, 16:45
pavarotti pavarotti вне форума
Прохожий
 
Регистрация: 28.11.2009
Сообщения: 19
Репутация: -10
По умолчанию Суммирование значений X на предмет поиска суммы чисел, равной Y

Здравствуйте!
Подскажите, пожалуйста, как можно решить задачу след. типа:
В программе набор постоянных значений. Например:
X1=30.48
X2=15.24
X3=13.97
X4=12.70
X5=11.43
X6=10.16
X7=8.89
X8=7.62
Единственное что вводит пользователь - это искомую им сумму Y.
Программа анализирует и выдает все возможные комбинации сумм Xi...j приближенно равных заданной (искомой) сумме Y, с указанием всех слагаемых в каждой найденной приближенной сумме. Каждый Xi..j программа может взять, скажем, два раза. Приближенность искомого равенства должна быть варьируемой пользователем.
Помогите, пожалуйста, советом как можно организовать такой анализ.
Ответить с цитированием
  #2  
Старый 02.12.2009, 13:06
pavarotti pavarotti вне форума
Прохожий
 
Регистрация: 28.11.2009
Сообщения: 19
Репутация: -10
Радость Неужели реально неразрешимая задача?!

Может кто всё таки подскажет как организовать сам перебор на сравнение. Или как это можно организовать через массив.
Ответить с цитированием
  #3  
Старый 02.12.2009, 14:22
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

Может я неправильно понял задание, но...
потом
Код:
var
 Mass[0..10] : array of real;//Массив данных
 StringList : TStringList;//Список результатов
begin
for i := 0 to Length(Mass)-1 do
 for j := 0 to Length(Mass)-1 do 
 begin
  if Y = Mass[i]+Mass[j] then
   StringList.Add(FloatToStr(Mass[i])+'+'+FloatToStr(Mass[j])+'='+FloatToStr(Y));
 end;
end;
__________________
В начале был Бит, потом Байт и только потом появилось Слово...
Ответить с цитированием
  #4  
Старый 27.02.2010, 13:22
pavarotti pavarotti вне форума
Прохожий
 
Регистрация: 28.11.2009
Сообщения: 19
Репутация: -10
По умолчанию Проблема решена.

Ништяк! Спасибо

Последний раз редактировалось pavarotti, 27.02.2010 в 13:28.
Ответить с цитированием
  #5  
Старый 27.02.2010, 13:29
Аватар для Ultras
Ultras Ultras вне форума
Начинающий
 
Регистрация: 09.02.2010
Адрес: Россия / Ставрополь
Сообщения: 138
Репутация: 475
По умолчанию

Цитата:
Сообщение от pavarotti
Где именно в этом коде идет проверка на равенство искомой суммы?
вот тут:
Код:
if Y = Mass[i]+Mass[j] then
__________________
Психических заболеваний НЕТ . Просто ДУРАК
Пусть лучше над тобой смеются, чем плачут...
Ответить с цитированием
  #6  
Старый 27.02.2010, 13:38
pavarotti pavarotti вне форума
Прохожий
 
Регистрация: 28.11.2009
Сообщения: 19
Репутация: -10
Радость Точно...

Отлично. Спасибо за ответ.
Не подскажете как легче всего представить найденные суммы из StringList, скажем в компоненте Memo или любом другом удобочитаемом компоненте?
Ответить с цитированием
  #7  
Старый 27.02.2010, 13:55
Аватар для Ultras
Ultras Ultras вне форума
Начинающий
 
Регистрация: 09.02.2010
Адрес: Россия / Ставрополь
Сообщения: 138
Репутация: 475
По умолчанию

Код:
Memo1.Lines.Text := StringList.Text;
или сразу добавлять значения в Memo:
Код:
Memo1.Lines.Add(FloatToStr(Mass[i])+'+'+FloatToStr(Mass[j])+'='+FloatToStr(Y));
__________________
Психических заболеваний НЕТ . Просто ДУРАК
Пусть лучше над тобой смеются, чем плачут...

Последний раз редактировалось Ultras, 27.02.2010 в 13:59.
Ответить с цитированием
  #8  
Старый 27.02.2010, 14:23
pavarotti pavarotti вне форума
Прохожий
 
Регистрация: 28.11.2009
Сообщения: 19
Репутация: -10
По умолчанию Чем глубже в лес....

В предложенном NIch'ем коде получается простой массив учета возможности варьирования сколько раз каждый элемент может быть взят для расчета?
Как можно описать массив в котором значение каждого элемента фиксированно, но количество каждого варьируется пользователем.

Вот что пока у меня пока получилось:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
 Mass: array[0..11] of real;
 StringList : TStringList;
 i,j,y:integer;

begin
Mass[0]:=StrToInt(Form2.Edit1.text);
Mass[1]:=StrToInt(Form2.Edit2.text);
Mass[2]:=StrToInt(Form2.Edit3.text);
Mass[3]:=StrToInt(Form2.Edit4.text);
Mass[4]:=StrToInt(Form2.Edit5.text);
Mass[5]:=StrToInt(Form2.Edit6.text);
Mass[6]:=StrToInt(Form2.Edit7.text);
Mass[7]:=StrToInt(Form2.Edit8.text);
Mass[8]:=StrToInt(Form2.Edit9.text);
Mass[9]:=StrToInt(Form2.Edit10.text);
Mass[10]:=StrToInt(Form2.Edit11.text);
Mass[11]:=StrToInt(Form2.Edit12.text);
Y:=strtoint(form1.edit6.Text);
for i:=0 to Length(Mass)-1 do
 for j := 0 to Length(Mass)-1 do
 begin
  if Y = Mass[i]+Mass[j] then
   StringList.Add(FloatToStr(Mass[i])+'+'+FloatToStr(Mass[j])+'='+FloatToStr(Y));
 end;

Memo1.Lines.Text := StringList.Text;

 end;
Admin: Пользуемся тегами!

Последний раз редактировалось Admin, 27.02.2010 в 20:27.
Ответить с цитированием
  #9  
Старый 28.02.2010, 04:06
Asinkrit Asinkrit вне форума
Местный
 
Регистрация: 29.10.2009
Сообщения: 446
Репутация: 271
По умолчанию

Хотелось бы подметить, во первых, автор вопроса говорил про "...приближенно равных заданной (искомой) сумме Y...", а предложенный ему вариант сравнивает на строгое совпадение суммы. Во вторых, данный алгоритм складывает каждый элемент с каждым, то есть, он так же складывает второй элемент со вторым, третий с третим, что возможно по заданию недопустимо.
Ответить с цитированием
  #10  
Старый 01.03.2010, 08:31
pavarotti pavarotti вне форума
Прохожий
 
Регистрация: 28.11.2009
Сообщения: 19
Репутация: -10
Радость Совершенно верно

Каждый элемент можно взять ровно столько раз сколько укажет пользователь. Можно складывать одинаковые элементы и друг с другом.

Поясню причину создания подобного массива и самой программки.
Существует одна Железяка, длина которой может варьироваться в зависимости от частного необходимого случая. Железяка скручивается из трех эелементов - Начало, Конец и Удлинители. Начало и Конец Железяки имеют фиксированную длину и в расчетах программы по сути не участвуют. А вот этих самых Удленнителей существует 12 разновидностей по длинне
182.88
91.44
54.61
44.45
30.48
15.24
13.97
12.70
11.43
10.16
8.89
7.62 см
У потенциального пользователя этой Железяки в момент её использовния может оказаться любое количество и ассортимент Удлиннителей.
Задача программы: пользователь вводит свой ассортимент и количество каждого типа Удлиннителя. Вводит искомую сумму (необходимую длинну Удлинителей), точность/приближенность найденной суммы и нажимает на кнопочку. А программа ему выдает список "рецептов" по тому из каких имеющихся Удлинителей можно получить искомую сумму с заданной точностью/приближенностью.

Прилагаю rar-архивчик с попыткой проекта создать такую программку.
Предполагаю, что задача, наверняка, легко решаема с помощью массивов, но, к сожалению, сам очень слабо владею этим понятием.
Проект создавался в бородатом Delphi 6.
Буду очень признателен за помощь и советы в создании проги.
Вложения
Тип файла: rar ECS2.rar (22.3 Кбайт, 0 просмотров)
Ответить с цитированием
  #11  
Старый 01.03.2010, 14:51
pavarotti pavarotti вне форума
Прохожий
 
Регистрация: 28.11.2009
Сообщения: 19
Репутация: -10
По умолчанию Еще один момент..

Так и не решил какой компонент лучше использовать для отображения найденных сумм Memo или ListBox.
Ответить с цитированием
  #12  
Старый 01.03.2010, 16:13
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,043
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Тут можно использовать следующую эвристику:
1. Создаем сортированный по убыванию массив твоих удлинителей, в каждой ячейке которого находится длинна и кол-во доступных элементов.
2. Программа пытается построить набор нужной длинны, выбирая сначала максимальную длинну, потом вторую по длинне и т.д. Короче, смотри задачу о портфеле - классическая задача.
Ответить с цитированием
  #13  
Старый 01.03.2010, 16:23
pavarotti pavarotti вне форума
Прохожий
 
Регистрация: 28.11.2009
Сообщения: 19
Репутация: -10
Радость Спасибо за совет.

Сейчас пошукаю задачу о портфеле.
Ответить с цитированием
  #14  
Старый 01.03.2010, 16:25
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,043
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Посмотри... там задача об акциях, но это не принципиально.
Суть задачи - найти оптимальное кол-во объектов по определенному критерию. У тебя критерий - общая длинна (заменяешь сумму на длинну и вперед).
Ответить с цитированием
  #15  
Старый 01.03.2010, 16:31
pavarotti pavarotti вне форума
Прохожий
 
Регистрация: 28.11.2009
Сообщения: 19
Репутация: -10
По умолчанию Блин...

Не нашел, к сожалению, "задачу о портфеле"...
Описание указанного массива не подскажете?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:24.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter