Programozás‎ > ‎Feladatok‎ > ‎Célérték keresés‎ > ‎Megoldás‎ > ‎

fg_cel.pas

Letöltés: fg_cel.pas

{$Q+}
PROGRAM celertek;

{a bemeneti adatokat konstansokben rogzitem}
CONST
    ben = 4; {a szamok szama}
    bet : ARRAY [1..ben] OF INTEGER = (20, 15, 5, 6); {a szamok felsorolasa}
    bec = 42; {a celertek}

TYPE
    chDef = ARRAY [1..ben] OF CHAR;

VAR
    bestV: LONGINT; {az eddigi legjobb elert celertek}

    chars: chDef; {az aktualis muveleti jelek}
    bestC: chDef; {az eddig legjobb celertekhez tartozo muveleti jelek,
                bestC[1] = '.', ha még nem találtunk egy celerteket sem}

        {chars[i], az (i)-edik szamjegy elotti muveleti jel, tehat
        chars[1] nincs ertelmezve...}



{
A level azt adja meg, hogy hany darab szamjegyet olvasztottunk ossze mar  sor elejen.
    a   level=1 azt jelenti, hogy, meg egyet sem, tehat nyilvan res = bet[1]
    pl. level=2 eseten 4 lehetoseg van: res=bet[1]+bet[2], res=bet[1]-bet[2], ...
    level=ben eseten res az egesz szamsorozat valamilyen muveletes "osszege" lesz,
        ekkor res minimumat keressuk
}
PROCEDURE Req(level: BYTE; res: LONGINT);
BEGIN
    IF level >= ben THEN
    BEGIN
        {minden szam ossze van muveletezve; minimum-kereses}
        IF (bestC[1] = '.') OR (ABS(res-bec) < ABS(bestV-bec)) THEN
        BEGIN
            {nem taroltunk meg erteket, vagy ez az ertek kozelebb van a celertekhez}
            bestV:= res;    {ertek tarolasa}
            bestC:= chars;  {muveleti jelek tarolasa}
        END;
    END
    ELSE
    BEGIN
        {vegigprobaljuk a 4 muveleti jelet...}
        chars[level]:= '+';
        Req(level+1, res+bet[level+1]);
        chars[level]:= '*';
        Req(level+1, res*bet[level+1]);
        chars[level]:= '-';
        Req(level+1, res-bet[level+1]);
        chars[level]:= '/';
        IF bet[level] <> 0 THEN Req(level+1, res DIV bet[level+1]);
    END;
END; {Req}

{a legjobb eredmeny kiirasa}
PROCEDURE DumpBest;
VAR
    i: BYTE;
BEGIN
    FOR i:= 1 TO ben DO Write('(');
    FOR i:= 1 TO ben-1 DO
    BEGIN
        Write(bet[i],')',bestC[i]);
    END;
    WriteLn(bet[ben],')=',bestV);
END; {DumpBest}

BEGIN
    bestC[1]:= '.'; {ez jelzi, hogy meg egy erteket sem szamoltunk ki}
    Req(1, bet[1]);
    DumpBest;
END.
ċ
fg_cel.pas
(2k)
Gábor Fehér,
2012. márc. 4. 7:24
Comments