Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program fill;
- uses crt;
- const MAX_COUNT = 500;
- type boxType = record
- size: integer;
- taken: boolean;
- end;
- type boxArray = array[0..MAX_COUNT] of boxType;
- type bestArrayInt = array[0..MAX_COUNT] of integer;
- type bestArray = array[1..2] of bestArrayInt;
- var i, amount, C: integer;
- dataFile: text;
- boxes: boxArray;
- //------------------------------------------------------------------------------
- function canFitMore(const b: boxArray; const n, c:integer): boolean;
- begin
- canFitMore := false;
- for i := 1 to n do
- if (c >= b[i].size) and not b[i].taken then
- canFitMore := true;
- end;
- //------------------------------------------------------------------------------
- procedure clearLast(var a:bestArrayInt; const n:integer);
- begin
- i:=1;
- for i:= 1 to n do
- if (a[i] = 0){ or (i = MAX_COUNT)} then
- break;
- if i <> 1 then
- a[i-1] := 0
- else
- a[i] := 0;
- end;
- //------------------------------------------------------------------------------
- procedure addToArray(var a:bestArrayInt; const n:integer);
- var i: integer;
- begin
- i:=1;
- for i:= 1 to n do
- if (a[i] = 0) {or (i = MAX_COUNT)} then
- break;
- a[i] := n;
- end;
- //------------------------------------------------------------------------------
- {procedure clearArray(var a:bestArrayInt);
- var i, n: integer;
- begin
- n := 1;
- while a[n] <> 0 do
- n := n + 1;
- for i:=1 to n do
- a[i] := 0;
- end;}
- //------------------------------------------------------------------------------
- function fitToBoxesRec(var b: boxArray; const n:integer; const c: integer;
- var best: bestArray; var done: boolean): integer;
- var i: integer;
- begin
- //writeln(best[1][0], ' ', best[2][0]);
- //delay(100);
- if best[2][0] > best[1][0] then
- best[1] := best[2];
- if c = 0 then
- done := true;
- fitToBoxesRec := best[1][0];
- for i:= 1 to n do
- begin
- if (b[i].size <= c) and not b[i].taken then
- begin
- addToArray(best[2], b[i].size);
- best[2][0] := b[i].size + best[2][0];
- b[i].taken := true;
- fitToBoxesRec := fitToBoxesRec(b, n, c - b[i].size, best, done);
- b[i].taken := false;
- best[2][0] := best[2][0] - b[i].size;
- clearLast(best[2], n);
- if done then exit;
- end;
- end;
- end;
- //------------------------------------------------------------------------------
- function fitToBoxes(b: boxArray; const n: integer; const C:integer): integer;
- var bestVer: bestArray;
- i, j:integer;
- index, value: integer;
- done: boolean;
- begin
- for i:= 0 to n do
- for j:= 1 to 2 do
- begin
- bestVer[j][i] := 0;
- end;
- done := false;
- index := 1;
- fitToBoxes := 0;
- while canFitMore(b, n, C) do
- begin
- value := fitToBoxesRec(b, n ,C , bestVer, done);
- //writeln(value);
- index := 1;
- //writeln('asd');
- while (bestVer[1][index] <> 0) do
- begin
- for i:=1 to n do
- if (b[i].size = bestVer[1][index]) and not b[i].taken then
- begin
- write(b[i].size,' ');
- b[i].taken := true;
- break;
- end;
- index := index + 1;
- end;
- writeln(': ',value);
- for i:= 0 to n do
- for j:= 1 to 2 do
- bestVer[j][i] := 0;
- fitToBoxes := fitToBoxes + 1;
- end;
- end;
- //------------------------------------------------------------------------------
- begin
- assign(dataFile, 'data.txt');
- reset(dataFile);
- //readln(dataFile, n);
- readln(dataFile, C);
- amount := 0;
- while not eof(dataFile) and (amount <= MAX_COUNT) do
- begin
- amount := amount + 1;
- readln(dataFile, boxes[amount].size);
- end;
- close(dataFile);
- writeln(fitToBoxes(boxes, amount, C));
- repeat
- delay(100);
- until keypressed;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement