unit Unit13; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls; type TForm13 = class(TForm) Edit1: TEdit; Label1: TLabel; Edit2: TEdit; Label2: TLabel; StringGrid1: TStringGrid; Label3: TLabel; Label4: TLabel; Button1: TButton; Button2: TButton; Button3: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Edit1Change(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } public { Public declarations } end; type mas_type=array[1..1000] of integer; var Form13: TForm13; a,num,sp:^mas_type; i,nom,k,min,max,sum,n:integer; flag:boolean; m1,m2:^mas_type; kolvo,cena,ost,s:integer; implementation {$R *.dfm} procedure TForm13.Button1Click(Sender: TObject); //основной алгоритм begin //Ввод данных n := StrTointDef(Edit1.Text, 0); // запоминаем количество предметов sum := StrTointDef(Edit2.Text, 0); // запоминаем вес ранца if n = 0 then // проверка введено ли количество предметов begin ShowMessage('Не задано количество предметов'); exit end; if sum = 0 then //проверка задан ли вес ранца begin ShowMessage('Не задан максимальный вес ранца'); exit end; flag:=true; if flag=true then begin new(a); new(sp); end; with StringGrid1 do // заполнение массива А весами предметов for i := 1 to n do begin // и массива SP стоимостью предметов a[i] := StrTointDef(Cells[1,i], 0); sp[i] := StrTointDef(Cells[2,i], 0); end; //новый алгоритм memo1.Text:=''; memo1.Text:=memo1.Text+'В рюкзак надо положить:'; ost:=sum; cena:=0; REPEAT max:=0; i:=1; repeat //присваиваем max первое ненулевое значение if sp[i]<>0 then max:=sp[i] else i:=i+1 until max<>0; for i:=1 to n do //находим максимальное значение стоимости if sp[i]>max then max:=sp[i]; k:=0; new(m1); new(m2); new(num); for i:=1 to n do //max найден, записываем в массив М все значения, стоимость которых равен max if sp[i]=max then begin k:=k+1; m1[k]:=a[i]; m2[k]:=sp[i]; num[k]:=i; //сохраняем номера предметов end; min:=m1[1]; nom:=num[1]; for i:=1 to k do //среди предметов с наибольшей стоимостью находим минимальный вес if m1[i]0 then min:=a[i] else i:=i+1 until (min<>0) or (i>n); dispose(m1); dispose(m2); dispose(num) UNTIL (min>ost) or (min=0); //новый алгоритм Memo1.Lines.Add('Прибыль в условных единицах '); Memo1.Text:=memo1.Text+ IntToStr(cena); dispose(sp); dispose(a); end; //окончание основной алгоритм procedure TForm13.Button2Click(Sender: TObject); //закрытие формы begin close end; //окончание закрытие формы procedure TForm13.Edit1Change(Sender: TObject); //дописывает стоки в таблицу var i, n: integer; begin n := StrTointDef(Edit1.Text, 0); with StringGrid1 do if (n > 0) and (n <= 100) then begin RowCount := n + 1; for I := 1 to RowCount - 1 do begin Cells[0, i] := IntToStr(i); end; end; end; //окончание дописывает стоки в таблицу procedure TForm13.FormCreate(Sender: TObject); //начальное присвоение var i: Integer; begin with StringGrid1 do begin Cells[0,0] := 'Номер предмета'; Cells[1,0] := 'Вес предмета'; Cells[2,0] := 'Стоимость предмета'; for I := 1 to RowCount - 1 do Cells[0, i] := IntToStr(i); Cells[1,1] := '1'; Cells[1,2] := '2'; Cells[1,3] := '3'; Cells[1,4] := '4'; Cells[2,1] := '40'; Cells[2,2] := '50'; Cells[2,3] := '180'; Cells[2,4] := '90'; end; end; //окончание начального присвоения procedure TForm13.Button3Click(Sender: TObject); begin randomize; flag:=false; new(a); new(sp); n := StrTointDef(Edit1.Text, 0); with StringGrid1 do for i := 1 to n do begin a[i]:=11-random(10); //для тестирования sp[i]:=random(30); cells[1,i]:=inttostr(a[i]); cells[2,i]:=inttostr(sp[i]); end; refresh(); end; end.