View difference between Paste ID: PcFjJeuX and RjuRMtqR
SHOW: | | - or go back to the newest paste.
1-
// 12. Duota N daiktų, kurių tūriai v1, v2, ... vN.
1+
2-
// Į kokį mažiausią skaičių tūrio M dėžučių galima sudėti šiuos daiktus?
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.