Пытался решить эту загадку, но не нашел правильного ответа. Вот сгенерированный код

У вас есть монеты достоинством 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)

Другие вопросы по тегам