|  | 
 
 | 
| 
 | |||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
|  | 
|  | Опции темы | Поиск в этой теме | Опции просмотра | 
| 
			 
			#1  
			
			
			
			
		 | |||
| 
 | |||
|  Суммирование значений 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  
			
			
			
			
		 | |||
| 
 | |||
|  Неужели реально неразрешимая задача?! Может кто всё таки подскажет как организовать сам перебор на сравнение. Или как это можно организовать через массив. | 
| 
			 
			#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  
			
			
			
			
		 | |||
| 
 | |||
|  Блин... Не нашел, к сожалению, "задачу о портфеле"... Описание указанного массива не подскажете? |