![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
|||
|
|||
|
Ну хоть кто-нибудь подскажите с последним вопросом!
|