【发布时间】:2011-09-09 08:35:55
【问题描述】:
我看到thisECLiPSe解决了thisXKCD漫画中提到的问题。我试图将其转换为纯 Prolog。
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).
我认为这不是人们能想到的最好/最具声明性的解决方案。有没有人有任何改进的建议?提前致谢!
【问题讨论】:
-
从最昂贵的项目向后工作似乎很有效,因为这些允许从预算/背包中减去更小的数量倍数(更少的分支)。对现有代码的简单修改是检查 TotalSoFar 是否小于或等于 EndTotal。通过纸笔尝试,我很快找到了解决方案。
标签: prolog np-complete clpfd