Так как вы упомянули SWI-Prolog, почему бы не
?- use_module(library(clpfd)).
и library(lambda)
?- Total = 1505, Prices = [215, 275, 335, 355, 420, 580],
maplist(\P^A^M^(P*A #= M, A #>=0),Prices,Amounts,Ms), sum(Ms, #=, Total).
Указав это, все переменные в списке Amounts
находятся в ограниченном диапазоне.Таким образом, нет необходимости «делать математику» для верхней границы (которая часто все равно идет не так).Чтобы увидеть конкретные решения, необходима маркировка / 2:
?- Total = 1505, Prices = [215, 275, 335, 355, 420, 580],
maplist(\P^A^M^(P*A #= M, A #>=0),Prices,Amounts,Ms), sum(Ms, #=, Total),
labeling([], Amounts).
Total = 1505,
Prices = [215,275,335,355,420,580],
Amounts = [1,0,0,2,0,1],
Ms = [215,0,0,710,0,580] ;
Total = 1505,
Prices = [215,275,335,355,420,580],
Amounts = [7,0,0,0,0,0],
Ms = [1505,0,0,0,0,0].