Advertisement
ridjis

dinamičko

Nov 26th, 2014
326
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. MODULE dynamic;
  2. FROM InOut  IMPORT WriteLn, WriteString, ReadString, WriteCard;
  3. FROM FIO    IMPORT File, Open, Close, Exists, RdInt;
  4. FROM Strings    IMPORT Concat;
  5.  
  6. CONST MaxKapacitet = 100;
  7.       MaxPredmeta = 20;
  8.  
  9. TYPE   
  10.     niz = ARRAY [0..MaxPredmeta] OF INTEGER;
  11.     matrica = ARRAY [0..MaxPredmeta], [0..MaxKapacitet] OF INTEGER;
  12.     String = ARRAY [1..256] OF CHAR;
  13.    
  14. VAR brojPredmeta, kapacitet, ukupnaTezina, ukupnaVrednost: INTEGER;
  15.         jedanNula, vrednost, tezina: niz;
  16.         ok: BOOLEAN;
  17.         imeF: String;
  18.  
  19. PROCEDURE Ucitaj (imeF: String; VAR vrednost, tezina: niz; VAR brojPredmeta, kapacitet: INTEGER);
  20. VAR i: INTEGER;
  21.     f: File;
  22. BEGIN      
  23.     f := Open(imeF);
  24.     kapacitet := RdInt(f);
  25.     brojPredmeta := RdInt(f);
  26.     FOR i := 1 TO brojPredmeta DO
  27.         vrednost[i] := RdInt(f);
  28.         tezina[i] := RdInt(f);
  29.     END;
  30.     WriteString("Podaci upisani u nizove. ");
  31.     WriteLn;
  32.     Close(f);
  33. END Ucitaj;
  34.  
  35. PROCEDURE Ruksak (vrednost, tezina: niz; brojPredmeta, kapacitet: INTEGER;
  36.           VAR jedanNula: niz; VAR ukupnaTezina, ukupnaVrednost: INTEGER; VAR ok: BOOLEAN);
  37. VAR i,j,pom: INTEGER;
  38.     op: matrica;
  39. BEGIN
  40.     IF ((0<brojPredmeta) & (brojPredmeta<=MaxPredmeta))
  41.         & ((0<kapacitet) & (kapacitet<=MaxKapacitet)) THEN
  42.         i:=1;
  43.         WHILE (tezina[i] > 0) & (vrednost[i] > 0) & (i < brojPredmeta) DO
  44.             INC(i);
  45.         END;
  46.         ok := ((tezina[i] > 0) & (vrednost[i] > 0));
  47.     ELSE
  48.         ok := FALSE;
  49.     END;
  50.     IF (ok) THEN
  51.         FOR j := 0 TO kapacitet DO
  52.             op[0,j] := 0;
  53.         END;
  54.         FOR i := 0 TO brojPredmeta DO
  55.             op[i,0] := 0;
  56.         END;
  57.         FOR i := 1 TO brojPredmeta DO
  58.             FOR j := 1 TO kapacitet DO
  59.                 op[i,j] := op[i-1,j];
  60.                 IF (j >= tezina[i]) THEN
  61.                     pom := op[i-1, j-tezina[i]] + vrednost[i];
  62.                     IF (pom > op[i,j]) THEN
  63.                         op[i,j] := pom;
  64.                     END;
  65.                 END;
  66.             END;
  67.         END;
  68.         ukupnaTezina := 0;
  69.         i := brojPredmeta;
  70.         j := kapacitet;
  71.         WHILE (i > 0) DO
  72.             IF (op[i,j] # op[i-1,j]) THEN
  73.                 jedanNula[i] := 1;
  74.                 ukupnaTezina := ukupnaTezina + tezina[i];
  75.                 j := j - tezina[i];
  76.             ELSE
  77.                 jedanNula[i] := 0;
  78.             END;
  79.             DEC(i);
  80.         END;
  81.         ukupnaVrednost := op[brojPredmeta, kapacitet];
  82.     END;   
  83. END Ruksak;
  84.  
  85. PROCEDURE Ispisi ();
  86. VAR i: INTEGER;
  87. BEGIN
  88.     WriteString("Redni broj: ");
  89.     WriteLn;
  90.     FOR i := 1 TO brojPredmeta DO
  91.         IF (jedanNula[i] = 1) THEN
  92.             WriteCard(i, 0);
  93.             WriteLn;
  94.         END;
  95.     END;
  96.     WriteLn;
  97.     WriteString("Od ukupnog kapaciteta ");
  98.     WriteCard(kapacitet, 1);
  99.     WriteString(" popunjeno je ");
  100.     WriteCard(ukupnaTezina, 1);
  101.     WriteLn;
  102.  
  103.     WriteString("Ukupna vrednost --- ");
  104.     WriteCard(ukupnaVrednost,1);
  105.     WriteLn;   
  106. END Ispisi;
  107.  
  108. BEGIN
  109.     WriteLn;
  110.     WriteString("Unesite ime fajla za ucitavanje: ");
  111.     WriteLn;
  112.     ReadString(imeF);
  113.     Concat(imeF, ".txt", imeF);
  114.     IF (Exists(imeF)) THEN
  115.         Ucitaj (imeF, vrednost, tezina, brojPredmeta, kapacitet);
  116.         Ruksak (vrednost, tezina, brojPredmeta, kapacitet, jedanNula, ukupnaTezina, ukupnaVrednost, ok);
  117.         IF (ok) THEN
  118.             WriteString("Vrednosti su dobro formatirane. ");
  119.             WriteLn;
  120.             Ispisi();
  121.             WriteLn;
  122.         ELSE
  123.             WriteString("Greska: Vrednosti nisu dobro formatirane. ");
  124.             WriteLn;
  125.         END;
  126.     ELSE
  127.         WriteString("Greska: Nepostojeci fajl. ");
  128.         WriteLn;       
  129.     END;
  130. END dynamic.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement