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