简单的逻辑就足够了,不需要程序/算法。
由于每个行业的变化,你有相同的量(这是一个)的芯片数量,你可以划分在一组,并在组大小的变化设定的目标之间的芯片的区别:
chipsIn = 1
chipsOut = 2
changePerTrade = chipsOut - chipsIn
numTrades = (goalSet.size - startSet.size)/changePerTrade
几个注意事项:
需要注意的是这只能是因为限制的,所有的行业都有相同的输入和输出尺寸,并假定每一个芯片必须朝着目标集数下工作(例如如果你试图获得AB,那么拥有ABC是失败的)。
这只会告诉你最少的交易次数(这也只是交易的最大次数),而不是是否有可能实现目标集。
解决问题的更通用的方法是探索可能性树。
这仅仅是一个树的搜索,在树中探索时在树中生成节点。你的树看起来是这样的(你的例子):
A
|
B,C
/ \
D,E,C B,F,G
| |
D,E,F,G D,E,F,G
其中芯片的树继续,每一个节点是一组(或列表中,如果允许重复)。一些想法可以帮助解释树的概念:
- 向下移动树代表工作转发。
- 向下移动一个分支代表单个交易。
- 由于您正在尝试寻找最少的交易次数,并且所有交易将您的套币的大小增加1,您只需要探索该树的
goalSet.size
级别。
您从节点A开始,循环遍历所有芯片,并一次执行一次可能的交易,每次执行一个更深的交易。
Here是一篇维基百科文章,解释如何做树遍历,您可以在探索它们时调整它以创建节点。深度优先搜索将是最简单的,因为您一次只需跟踪一个节点,但广度优先搜索可能会更快,但更多的实施困难。