Clingo ASP硬币兑换问题:同面值求和与全解输出方法
原代码核心问题
你写的初始代码有两个逻辑错误,无法满足需求:
- 选择规则
{selected(I)}是布尔选择,仅支持每种硬币选0或1枚,不支持同面值多选 - 求和逻辑仅累加选中硬币类型的单枚面值,没有按实际选取数量计算总金额
修正后实现代码
% 定义所有可用硬币面值,单位统一为美分 coins(1; 2; 5; 10; 20; 50; 100; 200). #const goal = 200. % 每种面值硬币可选取0到「总金额/单枚面值」枚,确保单种硬币选取总面值不超目标 {count(C, N) : N = 0..goal/C} = 1 :- coins(C). % 约束:所有选取硬币的总面值恰好等于200美分(即2美元) :- #sum{C*N, C : count(C, N)} != goal. % 配置输出:展示每个可行方案中各面值硬币的选取数量 #show count/2.
运行配置方法
- 输出所有可行答案集:在命令行执行clingo命令时加上参数
0,表示不限制枚举的答案集数量,命令格式为:clingo 你的代码文件名.lp 0 - 快速获取组合总数:如果不需要查看每个具体组合的明细,只需要最终组合数,额外加上
--quiet=1参数即可,命令格式为:clingo 你的代码文件名.lp 0 --quiet=1 - 结果查看:clingo运行结束后,输出末尾统计行
Models后跟随的数字,就是凑出2美元的所有可行组合总数,该场景下正确结果为73682。
内容的提问来源于stack exchange,提问作者Heaglock
相关产品推荐
相关产品推荐

