NP-полный рюкзак

Я видел это решение ECLiPSe для проблемы, упомянутой в этот комикс XKCD. Я пытался преобразовать его в чистый Пролог.

go:-
    Total = 1505,
    Prices = [215, 275, 335, 355, 420, 580],
    length(Prices, N),
    length(Amounts, N),
    totalCost(Prices, Amounts, 0, Total),
    writeln(Total).

totalCost([], [], TotalSoFar, TotalSoFar).
totalCost([P|Prices], [A|Amounts], TotalSoFar, EndTotal):-
    between(0, 10, A),
    Cost is P*A,
    TotalSoFar1 is TotalSoFar + Cost,
    totalCost(Prices, Amounts, TotalSoFar1, EndTotal).

Я не думаю, что это лучшее / наиболее декларативное решение, которое можно придумать. Есть ли у кого-нибудь предложения по улучшению? Заранее спасибо!

10
задан false 14 June 2014 в 10:24
поделиться