RosettaCodeData/Task/Knapsack-problem-0-1/Prolog/knapsack-problem-0-1-1.pro
Ingy döt Net db842d013d A-M baby
2013-04-10 21:29:02 -07:00

70 lines
2.4 KiB
Prolog

:- use_module(library(clpfd)).
knapsack :-
L = [
item(map, 9, 150),
item(compass, 13, 35),
item(water, 153, 200),
item(sandwich, 50, 160),
item(glucose, 15, 60),
item(tin, 68, 45),
item(banana, 27, 60),
item(apple, 39, 40),
item(cheese, 23, 30),
item(beer, 52, 10),
item('suntan cream', 11, 70),
item(camera, 32, 30),
item('t-shirt', 24, 15),
item(trousers, 48, 10),
item(umbrella, 73, 40),
item('waterproof trousers', 42, 70),
item('waterproof overclothes', 43, 75),
item('note-case',22, 80),
item(sunglasses, 7, 20),
item(towel, 18, 12),
item(socks, 4, 50),
item(book, 30, 10 )],
length(L, N),
length(R, N),
R ins 0..1,
maplist(arg(2), L, LW),
maplist(arg(3), L, LV),
scalar_product(LW, R, #=<, 400),
scalar_product(LV, R, #=, VM),
labeling([max(VM)], R),
scalar_product(LW, R, #=, WM),
%% affichage des résultats
compute_lenword(L, 0, Len),
sformat(A1, '~~w~~t~~~w|', [Len]),
sformat(A2, '~~t~~w~~~w|', [4]),
sformat(A3, '~~t~~w~~~w|', [5]),
print_results(A1,A2,A3, L, R, WM, VM).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% to show the results in a good way
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
compute_lenword([], N, N).
compute_lenword([item(Name, _, _)|T], N, NF):-
atom_length(Name, L),
( L > N -> N1 = L; N1 = N),
compute_lenword(T, N1, NF).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
print_results(A1,A2,A3, [], [], WM, WR) :-
sformat(W1, A1, [' ']),
sformat(W2, A2, [WM]),
sformat(W3, A3, [WR]),
format('~w~w~w~n', [W1,W2,W3]).
print_results(A1,A2,A3, [_H|T], [0|TR], WM, VM) :-
print_results(A1,A2,A3, T, TR, WM, VM).
print_results(A1, A2, A3, [item(Name, W, V)|T], [1|TR], WM, VM) :-
sformat(W1, A1, [Name]),
sformat(W2, A2, [W]),
sformat(W3, A3, [V]),
format('~w~w~w~n', [W1,W2,W3]),
print_results(A1, A2, A3, T, TR, WM, VM).