Advertisement
Guest User

Untitled

a guest
Apr 18th, 2013
570
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. program fill;
  2.  
  3. uses crt;
  4.  
  5. const MAX_COUNT =  500;
  6.  
  7. type boxType = record
  8.                 size: integer;
  9.                 taken: boolean;
  10.                end;
  11.  
  12.  
  13. type boxArray = array[0..MAX_COUNT] of boxType;
  14.  
  15. type bestArrayInt = array[0..MAX_COUNT] of integer;
  16.  
  17. type bestArray = array[1..2] of bestArrayInt;
  18.  
  19. var i, amount, C: integer;
  20.     dataFile: text;
  21.     boxes: boxArray;
  22.    
  23.  
  24. //------------------------------------------------------------------------------
  25.  
  26.  
  27. function canFitMore(const b: boxArray; const n, c:integer): boolean;
  28.  
  29. begin
  30.     canFitMore := false;
  31.    
  32.     for i := 1 to n do
  33.         if (c >= b[i].size) and not b[i].taken then
  34.             canFitMore := true;
  35.  
  36. end;
  37.  
  38.  
  39. //------------------------------------------------------------------------------
  40.  
  41.  
  42. procedure clearLast(var a:bestArrayInt; const n:integer);
  43.  
  44. begin
  45.     i:=1;
  46.     for i:= 1 to n do
  47.         if (a[i] = 0){ or (i = MAX_COUNT)} then
  48.             break;
  49.     if i <> 1 then
  50.         a[i-1] := 0
  51.         else
  52.         a[i] := 0;
  53. end;
  54.  
  55.    
  56. //------------------------------------------------------------------------------
  57.  
  58.  
  59. procedure addToArray(var a:bestArrayInt; const n:integer);
  60.  
  61. var i: integer;
  62.  
  63. begin
  64.     i:=1;
  65.     for i:= 1 to n do
  66.         if (a[i] = 0) {or (i = MAX_COUNT)} then
  67.             break;
  68.     a[i] := n;
  69. end;
  70.  
  71.  
  72. //------------------------------------------------------------------------------
  73.  
  74.  
  75. {procedure clearArray(var a:bestArrayInt);
  76.  
  77. var i, n: integer;
  78.  
  79. begin
  80.     n := 1;
  81.     while a[n] <> 0 do
  82.         n := n + 1;
  83.     for i:=1 to n do
  84.         a[i] := 0;
  85. end;}
  86.  
  87.  
  88. //------------------------------------------------------------------------------
  89.  
  90.    
  91. function fitToBoxesRec(var b: boxArray; const n:integer; const c: integer;
  92.                         var best: bestArray; var done: boolean): integer;
  93.  
  94. var i: integer;
  95.  
  96. begin
  97.     //writeln(best[1][0], ' ', best[2][0]);
  98.     //delay(100);
  99.     if best[2][0] > best[1][0] then
  100.         best[1] := best[2];
  101.        
  102.     if c = 0 then
  103.         done := true;
  104.        
  105.     fitToBoxesRec := best[1][0];
  106.  
  107.     for i:= 1 to n do
  108.         begin
  109.             if (b[i].size <= c) and not b[i].taken then
  110.                 begin
  111.                     addToArray(best[2], b[i].size);
  112.                     best[2][0] := b[i].size + best[2][0];
  113.                     b[i].taken := true;
  114.                     fitToBoxesRec := fitToBoxesRec(b, n, c - b[i].size, best, done);
  115.                     b[i].taken := false;
  116.                     best[2][0] := best[2][0] - b[i].size;
  117.                     clearLast(best[2], n);
  118.                     if done then exit;
  119.                 end;
  120.        
  121.         end;
  122. end;
  123.  
  124.  
  125. //------------------------------------------------------------------------------
  126.  
  127.    
  128. function fitToBoxes(b: boxArray; const n: integer; const C:integer): integer;
  129.  
  130. var bestVer: bestArray;
  131.     i, j:integer;
  132.     index, value: integer;
  133.     done: boolean;
  134.    
  135. begin
  136.     for i:= 0 to n do
  137.         for j:= 1 to 2 do
  138.             begin
  139.                 bestVer[j][i] := 0;
  140.             end;
  141.     done := false;
  142.     index := 1;
  143.     fitToBoxes := 0;
  144.     while canFitMore(b, n, C) do
  145.         begin
  146.             value := fitToBoxesRec(b, n ,C , bestVer, done);
  147.             //writeln(value);
  148.             index := 1;
  149.             //writeln('asd');
  150.             while (bestVer[1][index] <> 0) do
  151.                 begin
  152.                 for i:=1 to n do
  153.                     if (b[i].size = bestVer[1][index]) and not b[i].taken then
  154.                         begin
  155.                         write(b[i].size,' ');
  156.                         b[i].taken := true;
  157.                         break;
  158.                         end;
  159.                 index := index + 1;
  160.                 end;
  161.             writeln(': ',value);
  162.             for i:= 0 to n do
  163.                 for j:= 1 to 2 do
  164.                     bestVer[j][i] := 0;
  165.             fitToBoxes := fitToBoxes + 1;
  166.         end;
  167.  
  168.    
  169. end;
  170.  
  171.  
  172. //------------------------------------------------------------------------------
  173.  
  174.  
  175. begin
  176.  
  177.   assign(dataFile, 'data.txt');
  178.   reset(dataFile);
  179.   //readln(dataFile, n);
  180.   readln(dataFile, C);
  181.   amount := 0;
  182.   while not eof(dataFile) and (amount <= MAX_COUNT) do
  183.     begin
  184.         amount := amount + 1;
  185.         readln(dataFile, boxes[amount].size);
  186.     end;
  187.    
  188.   close(dataFile);
  189.   writeln(fitToBoxes(boxes, amount, C));
  190.  
  191.   repeat
  192.   delay(100);
  193.   until keypressed;
  194. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement