Problema Rucsacului (discretă)

prolog_logo
Cod Sursa PROLOG

% Problema discreta a rucsacului
% O persoana are un rucsac cu care poate transporta o greutate
% maxima G. Persoana are la dispozitie N obiecte si cunoaste pt.
% fiecare obiect greutatea si castigul (valoarea) care se obtine
% in urma transportului sau la destinatie. Se cere sa se precizeze
% ce obiecte trebuie sa transporte persoana astfel incat castigul
% sa fie maxim, iar greutatea sa fie egala cu cea precizata.
% Apel:
% ?-solutieposibila(100,[ob(10,30),ob(28,30),ob(90,2)],R).
% ?-solutieposibila(120,[ob(15,30),ob(105,30),ob(90,2),ob(15,5)],R).
% predicatul subl() : extrage toate sublistele unei liste.
subl([],[]).
subl([H|T],[H|T1]):-subl(T,T1).
subl(L,[_|T1]):-subl(L,T1).
% ob(G,V) – obiectul cu greutatea G si valoarea V
suma([],0,0).
suma([ob(G,V)|T],R,R1):-suma(T,SGT,SVT),R is G+SGT,R1 is V+SVT.
solutieposibila(G,L,R):-subl(R,L),suma(R,SGR,SVR),SGR=G.

Interogări:
| ?- solutieposibila(120,[ob(15,30),ob(105,30),ob(90,2),ob(15,5)],R) .
R = [ob(15,30),ob(105,30)]
R=[ob(15,30),ob(90,2),ob(15,5)]
R=[ob(105,30),ob(15,5)]
| ?- solutieposibila(100,[ob(10,30),ob(28,30),ob(90,2)],R) .
R = [ob(10,30),ob(90,2)] ?
| ?- solutieposibila(120,[ob(15,30),ob(40,30),ob(90,2),ob(15,5)],R) .
R = [ob(15,30),ob(90,2),ob(15,5)] ?
| ?- solutieposibila(120,[ob(15,30),ob(40,30),ob(90,2),ob(5,5)],R) .
NO

Leave a comment