1

所以这是一个货币系统,用 8 种不同价值的硬币计算出最少的硬币数量。例如:1 美分、2 美分、4 美分、33 美分等……其中一枚硬币的价值必须为“5”。所以这个程序试图确定其他 7 个硬币值必须具有哪些其他单个值,以及每个值有多少个硬币,总和在 1 到 99 美分之间。

所以我的问题是,有没有一种方法可以编写一段代码而无需手动将“5”插入程序(例如:Values = [_, _, _, _, 5, _, _, _] 或值 = [ _, 5, _, _, _, _, _, _] )?所以这里应该有不止一种解决方案......

这是代码:

questionSix(Values, Coins) :-
    init_vars(Values, Coins),
    coin_cons(Values, Coins, Pockets),
    clever_cons(Values, Coins),
    Min #= sum(Coins),
    minimize((labeling(Values), labeling(Coins), check(Pockets)), Min).

init_vars(Values, Coins) :-
    length(Values, 8),
    Values = [_, _, _, 5, _, _, _, _],
    Values :: 1..99,
    increasing(Values),
    length(Coins, 8),
    Coins :: 0..99.

increasing(List) :-
    ( fromto(List, [This, Next | Rest], [Next | Rest], [_])
    do
        This #< Next
    ).

clever_cons(Values, Coins) :-
    ( fromto(Values, [V1 | NV], NV, []), 
      fromto(Coins, [N1 | NN], NN, [])
     do
        ( NV = [V2 | _]
            -> N1*V1 #< V2;
            N1*V1 #< 100
        )
    ).

任何帮助表示赞赏。谢谢!

4

1 回答 1

0

您可以occurrencesic_global库中使用(http://eclipseclp.org/doc/bips/lib/ic_global/occurrences-3.html):

 occurrences(5, Values, 1)

另一种更冗长但没有ic_global的方法是构建第一个值为 5 或第二个值为 5 等约束的析取。(我尚未测试此代码):

( foreach(Vi, Values), fromto(0, Eprev, Ecurr, Expr) do
    Ecurr = Eprev or (Vi #= 5) ),
1 #= eval(Expr)
于 2014-05-19T05:23:30.617 回答