|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#16
|
||||
|
||||
Эту задачу называют по разному...
http://ru.wikipedia.org/wiki/Задача_о_ранце В начале был Бит, потом Байт и только потом появилось Слово... |
#17
|
|||
|
|||
Очень близко!
Спасибо за задачу о портфеле/рюкзаке - действительно очень подходящий алгоритм решения.
Всё же несколько моментов не учитываются этим алгоритмом: 1. Он не работает с не-целыми числами. (хотя это не важно,с вои элементы я могу и округлить, границы погрешности позволяет). 2. В нём пользователь вводит сами элементы, которые нужно суммировать. У меня же элементы уже известны, единственное что вводит пользователь это какие именно из элементов участвуют в расчете и сколько каждого. P.S. Прилагаю программку, которую нашел по методу решения проблемы рюкзака. В ней не учтен ввод количества каждого элемента, т.е. сколько раз программа может взять один и тот же предмет для расчета одного "рецепта" получения желаемой суммы. Все остальные подобные алгоритмы найденные в интернете примерно такого же содержания. |
#18
|
|||
|
|||
Классически задача о рюкзаке звучит так:
Из неограниченного множества предметов со свойствами „стоимость“ и „вес“, требуется отобрать некое число предметов таким образом, чтобы получить максимальную суммарную стоимость при одновременном соблюдении ограничения на суммарный вес. По сути у меня просто несколько измененная версия "задачи о рюкзаке". Из предметов разного веса и количества каждого типа предметов, со свойством „вес“, требуется отобрать некое число предметов таким образом, чтобы получить заранее известный суммарный вес. Т.е. наверное, можно сказать, что у каждого элемента есть два свойства "вес" и "количество". Никак не соображу, как существующую прогу (прикреплена в предыдущем сообщении выше) можно изменить под мою задачу. |
#19
|
|||
|
|||
Может кто подскажет...
Где в этом коде вставить разграничинительный символ или еще что, чтобы полученные рецепты получения указанной суммы как-то дифференцировались друг от друга?
Например, выводил каждый найденный "рецепт" в новой строке в компоненте Memo. Код:
procedure TForm13.Button1Click(Sender: TObject); var a,b:array[1..100] of integer; n:byte; sum:integer; f:boolean; i,j,k,h,s,m,z:integer; otvet: string; begin n := StrTointDef(Edit1.Text, 0); if n = 0 then begin ShowMessage('Не задано количество предметов'); exit end; with StringGrid1 do for i := 1 to n do a[i] := StrTointDef(Cells[1,i], 0); sum := StrTointDef(Edit2.Text, 0); if sum = 0 then begin ShowMessage('Не задан максимальный вес предмета'); exit end; otvet := 'В ранец необходимо поместить предметы: '; For I := N Downto 1 Do Begin B[1] := I; H := 1; K := Sum - A[i]; F := False; Repeat For J := B[H]-1 Downto 1 Do Begin If A[J] <= K Then Begin Inc(H); B[H] := J; Dec(K, A[J]); End; If K = 0 Then Begin For M := 1 to H Do otvet := otvet + IntToStr(A[B[M]]) + '|'; Inc(K, A[B[H]]); Dec(H); End; End; F := True; For M := H Downto 2 Do Begin If B[M] <> H-M+1 Then Begin F := False; Dec(B[M]); H := M; K := Sum; For Z := 1 to H Do Dec(K, A[B[Z]]); Break; End; End; Until F; End; memo1.Lines.Add(otvet + ' ') Последний раз редактировалось Admin, 03.03.2010 в 22:01. |
#20
|
|||
|
|||
Товарищи!
Ну хоть кто-нибудь подскажите с последним вопросом!
|