我是炼金术士。根据我的食谱书,我可以用其他东西来制作东西。例如:
2 lead + 1 bismuth -> 1 carbon
1 oxygen + 5 hydrogen + 3 nitrogen -> 2 carbon
5 carbon + 5 titanium -> 1 gold
...etc.
我的食谱书包含数以千计的食谱,每个食谱消耗一些离散量的一个或多个输入,并产生离散量的一个输出。作为一个懒惰的炼金术士,我不想记住我的所有食谱。我想写一个计算机程序来解决这个问题。该程序的输入是我想要的描述,如“2金”,以及我库存的描述,如“5钛,6铅,3铋,2碳,1金”。输出应该是“无法制作”或用于创建事物的一系列指令。对于此处给出的示例,输出可以是:
make 2 carbon out of 4 lead + 2 bismuth
make 1 gold out of 4 carbon + 4 titanium
然后,结合我已经拥有的1枚金币,我得到了我想要的2枚金币。
最后一点:食谱是加权的;例如如果可以的话,我更喜欢用铅和铋制造碳。
有没有一种优雅的方式来制定和解决这个问题?一个天真的递归解决方案看起来很诱人,但我可以想到会导致它做一定数量工作的配方集。
(并且,作为后续,有一天我的研究可能会发现一套循环的食谱 - 也许我可以用1氦气和1个氢气中的1个氦气制造1个氢气 - 我希望能够处理这种情况也是如此。)
答案 0 :(得分:2)
问题是NP难。
鉴于CNF-SAT的一个实例,准备含有试剂的炼金术表
反应是
问题是我们是否可以根据每个变量和每个子句中的一个(不满意的版本)给出输出。
该问题与确定向量加法系统/ Petri网的可达性的问题有关;我的减少部分基于文献中出现的减少。