Пытался решить эту загадку, но не нашел правильного ответа. Вот сгенерированный код
У вас есть монеты достоинством 5, 10, 20, 50, 100
чьи веса соответственно 2 г, 3 г, 10 г, 25 г, 50 г. Ваш кошелек слабый, поэтому вы не можете превышать вес 391 г. И вы можете положить в него только 3 монеты, имеющие одинаковое значение. Можете ли вы сказать, какова максимальная стоимость вашего кошелька?
Запрос::: change([(Five,Ten,Twenty,Fifty,Hundred),W,S])
range(I,I,[I]).
range(I,K,[I|L]) :-
I < K,
I1 is I + 1,
range(I1,K,L).
coin(X,L) :-
range(0,3,L1),
member(X,L1).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
change([(Five,Ten,Twenty,Fifty,Hundred),W,S]) :-
coin(Five,L),
coin(Ten,L),
coin(Twenty,L),
coin(Fifty,L),
coin(Hundred,L),
W1 = 50*Hundred + 25*Fifty + 10*Twenty +3*Ten+ 2*Five,
S1 = 5*Five+ 10*Ten+ 20*Twenty + 50*Fifty + 100*Hundred,
W1 < 391,
W is W1,
S is S1,
maximum(S1).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
maximum(S1) :-
S is S1,
threshold(S),
not( S1 < S).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
threshold(S1) :-
M is S1,
not( M < 451).
2 ответа
Используйте clpfd и просто выполните следующий запрос:
: - use_module ( библиотека (clpfd)).? - [Сто, пятьдесят, двадцать, десять, пять] ins0..3, Вес #=<;; 391, Вес #=50 * Сто + 25 * Пятьдесят + 10* Двадцать + 3 * Десять + 2 * Пять, Значение #=100 * Сто + 50 * Пятьдесят + 20 * Двадцать + 10* Десять + 5 * Пять, маркировка([max(Value)], [Hundred,Fifty,Twenty,Ten,Five]). Сто = 3, пятьдесят = 3, двадцать = 3, десять = 3, пять = 3, значение = 555, вес = 270; Сто = 3, пятьдесят = 3, двадцать = 3, десять = 3, пять = 2, значение = 550, вес = 268; ...
"генерировать и тестировать" выполняется библиотекой ( агрегат):
change(S) :-
aggregate(max(V), P^W^(purse(P, W, V), W < 391), S).
purse(P, W, V) :-
length(P, 5),
maplist(between(0, 3), P),
scalar(P, [2,3,10,25,50], W),
scalar(P, [5,10,20,50,100], V).
scalar(Vs, Fs, S) :-
foldl([V,F,V0,U]>>(U is V0+V*F), Vs, Fs, 0, S).
scalar / 3 - это слишком трудоемкий проект, примите его за предложение изучить scalar_product/ 4, если вы идете с библиотекой ( clpfd)