![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Задача о рюкзаке.
По идее программа должна вычислять максимальную стоимость набора при ограниченном весе. Но судя по всему задача выбирает максимальную стоимость по последнему предмету. Где ошибка? В приложенном файле исходники. Исходные данные для работы программы (Исходные данные для работы программы считываются из файла). Файл: “ DATA.txt”. 3 49 8 22 10 28 14 40 Исходный текст программы. Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; Const NMax = 100; type Thash = array[0..1000] of longint; TC = array[1..NMax] of longint; TW = array[0..NMax] of longint; TT = array[0..NMax,0..NMax] of Integer; Tbit = array[0..NMax] of byte; TForm1 = class(TForm) ListBox1: TListBox; Button_Save: TButton; Label_FileNameOut: TLabel; SaveDialog_Out: TSaveDialog; procedure FormCreate(Sender: TObject); procedure Button_SaveClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; i,j,k,p:Integer; N,M:Integer; {kol-vo raznovidnostey elementov i gruzopod'emnost'} sum:Integer; b:Boolean; total:longint; {nabrannaia massa iz elementov} cost:longint; max:Integer; hash : Thash; C : TC; W : TW; T : TT; bit : Tbit; kbit : Tbit; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin ListBox1.Clear; AssignFile(input,'DATA.txt'); Reset(input); readln(N,M); for i:=1 to N do begin readln(W[i],C[i]); bit[i]:=0; { bit vhojdeniia: esli=1, to vhodit, inache net } kbit[i]:=0; { kol-vo vhojdenii elementa} hash[C[i]]:=i; { sviazivaem napriamuiu stoimost' s poriadkovim nomerom} end; hash[0]:=0; closefile(input); T[0,0]:=0; for j:=1 to M do T[0,j]:=0; for i:=1 to N do T[i,0]:=0; {sortiruem dlia uprosheniia poiska} for j:=1 to N-1 do begin for i:=1 to N-j do begin if C[i]>C[i+1] then begin p:=W[i]; k:=C[i]; W[i]:=W[i+1]; C[i]:=C[i+1]; W[i+1]:=p; C[i+1]:=k; end; end; end; for k:=1 to N do begin for i:=1 to N do begin for j:=1 to M do begin if j>=W[i] then begin max:=0; for p:=1 to k do if j>=W[p] then if (T[i-1,j-W[p]]+C[p])>max then max := T[i-1,j-W[p]]+C[p]; if T[i-1,j] >= max then T[i,j]:=T[i-1,j] else T[i,j]:=max; end else T[i,j]:=T[i-1,j]; end; end; end; {poisk, ispol'zuia hash} b:=true; W[0]:=0; total:=0; while b=true do begin for i:=N downto 1 do begin if total+W[hash[T[i,M]-T[i-1,M]]] >= M then begin b:=false; break; end else begin total:=total+W[hash[T[i,M]-T[i-1,M]]]; bit[hash[T[i,M]-T[i-1,M]]]:=1; inc(kbit[hash[T[i,M]-T[i-1,M]]]); end; end; if b = false then break; end; {vivod rezul'tatov} ListBox1.Items.Append('Исходный набор предметов:'); ListBox1.Items.Append(''); for i:=1 to N do begin ListBox1.Items.Append('Товар № ' + IntToStr(i)); ListBox1.Items.Append(' вес: =' + IntToStr(W[i]) + ', цена: =' + IntToStr(C[i])); end; ListBox1.Items.Append(''); ListBox1.Items.Append('Максимальный вес: ' + IntToStr(M)); ListBox1.Items.Append(''); ListBox1.Items.Append('Результат'); ListBox1.Items.Append('-------------------------------------------------'); total:=0; cost:=0; ListBox1.Items.Append(''); k:=0; ListBox1.Items.Append('Итоговый оптимальный набор:'); ListBox1.Items.Append(''); for i:=1 to N do begin if bit[i]=1 then begin ListBox1.Items.Append('Товар № ' + IntToStr(i)); ListBox1.Items.Append(' вес: ' + IntToStr(W[i]) + ', стоимость: ' + IntToStr(C[i])); ListBox1.Items.Append(' - ' + IntToStr(kbit[i]) + ' шт.'); total:=total+W[i]*kbit[i]; cost:=cost+C[i]*kbit[i]; end; end; ListBox1.Items.Append(''); ListBox1.Items.Append('Максимальный вес набора: ' + IntToStr(total)); ListBox1.Items.Append(''); ListBox1.Items.Append('Максимальная цена набора: ' + IntToStr(cost)); end; procedure TForm1.Button_SaveClick(Sender: TObject); begin Form1.Label_FileNameOut.Caption:= 'Out.txt'; Form1.ListBox1.Items.SaveToFile('Out.txt'); end; end. Результаты работы программы (результаты работы программы записываются в файл). Исходный набор предметов: Товар № 1 вес: =8, цена: =22 Товар № 2 вес: =10, цена: =28 Товар № 3 вес: =14, цена: =40 Максимальный вес: 49 Результат ------------------------------------------------- Итоговый оптимальный набор: Товар № 3 вес: 14, стоимость: 40 - 3 шт. Максимальный вес набора: 42 Максимальная цена набора: 120 Полученный набор имеет не максимальную стоимость, ищите ошибки в программе. |
#2
|
||||
|
||||
![]() Вот фиг его знает, что вы читаете из текстового файла в целочисленные переменные.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |