![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Здравствуйте!
Подскажите, пожалуйста, как можно решить задачу след. типа: В программе набор постоянных значений. Например: 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
|
|||
|
|||
![]() Может кто всё таки подскажет как организовать сам перебор на сравнение. Или как это можно организовать через массив.
|
#3
|
||||
|
||||
![]() Может я неправильно понял задание, но...
потом Код:
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
|
|||
|
|||
![]() Ништяк! Спасибо
Последний раз редактировалось pavarotti, 27.02.2010 в 13:28. |
#5
|
||||
|
||||
![]() Цитата:
Код:
if Y = Mass[i]+Mass[j] then Психических заболеваний НЕТ ![]() ![]() Пусть лучше над тобой смеются, чем плачут... |
#6
|
|||
|
|||
![]() Отлично. Спасибо за ответ.
Не подскажете как легче всего представить найденные суммы из StringList, скажем в компоненте Memo или любом другом удобочитаемом компоненте? |
#7
|
||||
|
||||
![]() Код:
Memo1.Lines.Text := StringList.Text; Код:
Memo1.Lines.Add(FloatToStr(Mass[i])+'+'+FloatToStr(Mass[j])+'='+FloatToStr(Y)); Психических заболеваний НЕТ ![]() ![]() Пусть лучше над тобой смеются, чем плачут... Последний раз редактировалось Ultras, 27.02.2010 в 13:59. |
#8
|
|||
|
|||
![]() В предложенном 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, 27.02.2010 в 20:27. |
#9
|
|||
|
|||
![]() Хотелось бы подметить, во первых, автор вопроса говорил про "...приближенно равных заданной (искомой) сумме Y...", а предложенный ему вариант сравнивает на строгое совпадение суммы. Во вторых, данный алгоритм складывает каждый элемент с каждым, то есть, он так же складывает второй элемент со вторым, третий с третим, что возможно по заданию недопустимо.
|
#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. Буду очень признателен за помощь и советы в создании проги. |
#11
|
|||
|
|||
![]() Так и не решил какой компонент лучше использовать для отображения найденных сумм Memo или ListBox.
|
#12
|
|||
|
|||
![]() Тут можно использовать следующую эвристику:
1. Создаем сортированный по убыванию массив твоих удлинителей, в каждой ячейке которого находится длинна и кол-во доступных элементов. 2. Программа пытается построить набор нужной длинны, выбирая сначала максимальную длинну, потом вторую по длинне и т.д. Короче, смотри задачу о портфеле - классическая задача. |
#13
|
|||
|
|||
![]() Сейчас пошукаю задачу о портфеле.
|
#14
|
|||
|
|||
![]() Посмотри... там задача об акциях, но это не принципиально.
Суть задачи - найти оптимальное кол-во объектов по определенному критерию. У тебя критерий - общая длинна (заменяешь сумму на длинну и вперед). |
#15
|
|||
|
|||
![]() Не нашел, к сожалению, "задачу о портфеле"...
Описание указанного массива не подскажете? |