所以这是一个货币问题,它计算出最少的硬币数量。有4种不同的硬币(1美分,5美分,10美分和25美分)。因此,当我运行该程序时,结果给了我这个:
?- questionFour(Coins, X).
Coins = [4, 1, 2, 3]
X = 10
Yes (0.03s cpu)
Found a solution with cost 10
Found no solution with cost 4.0 .. 9.0
指示说:“我们希望在口袋中携带尽可能少的硬币,但我们也希望确保这些硬币能满足1到99美分的任何金额。”所以,当我计算总数时,它产生了104美分。如何才能使总分在1到99美分之间?我不确定我做的是对的还是我需要为此添加更多代码...
questionFour(Coins, Min) :-
initiatingcoinsquestionFour(Values, Coins),
coin_cons(Values, Coins, Pockets),
Min #= sum(Coins),
minimize((labeling(Coins), check(Pockets)), Min).
initiatingcoinsquestionFour(Values, Coins) :-
Values = [1, 5, 10, 25],
length(Coins, 4),
Coins :: 0..99.
coin_cons(Values, Coins, Pockets) :-
( for(Price, 1, 99),
foreach(CoinsforPrice, Pockets),
param(Coins, Values)
do
price_cons(Price, Coins, Values, CoinsforPrice)
).
price_cons(Price, Coins, Values, CoinsforPrice) :-
( foreach(V, Values), foreach(C, CoinsforPrice), foreach(Coin, Coins),
foreach(Prod, ProdList)
do
Prod = V*C,
0 #=< C,
C #=< Coin
),
Price #= sum(ProdList).
check(Pockets) :-
( foreach(CoinsforPrice, Pockets)
do
once(labeling(CoinsforPrice))
).
我不确定我做的是否正确,但我希望你对此有所了解......谢谢!
答案 0 :(得分:0)
我认为你的答案是正确的。如果你想从这些硬币中获得任何价值1..99,那么所有选定硬币的总和为104是完全合理的。
这是一个程序(与你的程序截然不同)我写的是为了验证你的结果。我有相同的答案 - 所以我认为你的程序没问题。
:- lib(ic).
:- lib(branch_and_bound).
questionFour(Coins, Sum) :-
Values = [](1, 5, 10, 25),
dim(Coins, [4]),
Coins :: 0..99,
( for(Amount, 1, 99), param(Values, Coins) do
[Ai, Bi, Ci, Di] :: 0..99,
Ai #=< Coins[1], Bi #=< Coins[2], Ci #=< Coins[3], Di #=< Coins[4],
Ai * Values[1] + Bi * Values[2] + Ci * Values[3] + Di * Values[4] #= Amount ),
array_list(Coins, CoinsList),
Sum #= sum(CoinsList),
minimize(labeling(Coins), Sum).