对于Prolog中的货币代码,我如何确保硬币总数在1到99美分之间?

时间:2014-05-19 17:06:39

标签: prolog eclipse-clp

所以这是一个货币问题,它计算出最少的硬币数量。有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))
).

我不确定我做的是否正确,但我希望你对此有所了解......谢谢!

1 个答案:

答案 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).