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. |