Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- MODULE dynamic;
- FROM InOut IMPORT WriteLn, WriteString, ReadString, WriteCard;
- FROM FIO IMPORT File, Open, Close, Exists, RdInt;
- FROM Strings IMPORT Concat;
- CONST MaxKapacitet = 100;
- MaxPredmeta = 20;
- TYPE
- niz = ARRAY [0..MaxPredmeta] OF INTEGER;
- matrica = ARRAY [0..MaxPredmeta], [0..MaxKapacitet] OF INTEGER;
- String = ARRAY [1..256] OF CHAR;
- VAR brojPredmeta, kapacitet, ukupnaTezina, ukupnaVrednost: INTEGER;
- jedanNula, vrednost, tezina: niz;
- ok: BOOLEAN;
- imeF: String;
- PROCEDURE Ucitaj (imeF: String; VAR vrednost, tezina: niz; VAR brojPredmeta, kapacitet: INTEGER);
- VAR i: INTEGER;
- f: File;
- BEGIN
- f := Open(imeF);
- kapacitet := RdInt(f);
- brojPredmeta := RdInt(f);
- FOR i := 1 TO brojPredmeta DO
- vrednost[i] := RdInt(f);
- tezina[i] := RdInt(f);
- END;
- WriteString("Podaci upisani u nizove. ");
- WriteLn;
- Close(f);
- END Ucitaj;
- PROCEDURE Ruksak (vrednost, tezina: niz; brojPredmeta, kapacitet: INTEGER;
- VAR jedanNula: niz; VAR ukupnaTezina, ukupnaVrednost: INTEGER; VAR ok: BOOLEAN);
- VAR i,j,pom: INTEGER;
- op: matrica;
- BEGIN
- IF ((0<brojPredmeta) & (brojPredmeta<=MaxPredmeta))
- & ((0<kapacitet) & (kapacitet<=MaxKapacitet)) THEN
- i:=1;
- WHILE (tezina[i] > 0) & (vrednost[i] > 0) & (i < brojPredmeta) DO
- INC(i);
- END;
- ok := ((tezina[i] > 0) & (vrednost[i] > 0));
- ELSE
- ok := FALSE;
- END;
- IF (ok) THEN
- FOR j := 0 TO kapacitet DO
- op[0,j] := 0;
- END;
- FOR i := 0 TO brojPredmeta DO
- op[i,0] := 0;
- END;
- FOR i := 1 TO brojPredmeta DO
- FOR j := 1 TO kapacitet DO
- op[i,j] := op[i-1,j];
- IF (j >= tezina[i]) THEN
- pom := op[i-1, j-tezina[i]] + vrednost[i];
- IF (pom > op[i,j]) THEN
- op[i,j] := pom;
- END;
- END;
- END;
- END;
- ukupnaTezina := 0;
- i := brojPredmeta;
- j := kapacitet;
- WHILE (i > 0) DO
- IF (op[i,j] # op[i-1,j]) THEN
- jedanNula[i] := 1;
- ukupnaTezina := ukupnaTezina + tezina[i];
- j := j - tezina[i];
- ELSE
- jedanNula[i] := 0;
- END;
- DEC(i);
- END;
- ukupnaVrednost := op[brojPredmeta, kapacitet];
- END;
- END Ruksak;
- PROCEDURE Ispisi ();
- VAR i: INTEGER;
- BEGIN
- WriteString("Redni broj: ");
- WriteLn;
- FOR i := 1 TO brojPredmeta DO
- IF (jedanNula[i] = 1) THEN
- WriteCard(i, 0);
- WriteLn;
- END;
- END;
- WriteLn;
- WriteString("Od ukupnog kapaciteta ");
- WriteCard(kapacitet, 1);
- WriteString(" popunjeno je ");
- WriteCard(ukupnaTezina, 1);
- WriteLn;
- WriteString("Ukupna vrednost --- ");
- WriteCard(ukupnaVrednost,1);
- WriteLn;
- END Ispisi;
- BEGIN
- WriteLn;
- WriteString("Unesite ime fajla za ucitavanje: ");
- WriteLn;
- ReadString(imeF);
- Concat(imeF, ".txt", imeF);
- IF (Exists(imeF)) THEN
- Ucitaj (imeF, vrednost, tezina, brojPredmeta, kapacitet);
- Ruksak (vrednost, tezina, brojPredmeta, kapacitet, jedanNula, ukupnaTezina, ukupnaVrednost, ok);
- IF (ok) THEN
- WriteString("Vrednosti su dobro formatirane. ");
- WriteLn;
- Ispisi();
- WriteLn;
- ELSE
- WriteString("Greska: Vrednosti nisu dobro formatirane. ");
- WriteLn;
- END;
- ELSE
- WriteString("Greska: Nepostojeci fajl. ");
- WriteLn;
- END;
- END dynamic.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement