0

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

我不确定我所做的是否正确,但我想听听您对此的看法……谢谢!

4

1 回答 1

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).
于 2014-05-19T18:57:43.233 回答