簡單的邏輯就足夠了,不需要程序/算法。
由於每個行業的變化,你有相同的量(這是一個)的芯片數量,你可以劃分在一組,並在組大小的變化設定的目標之間的芯片的區別:
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是一篇維基百科文章,解釋如何做樹遍歷,您可以在探索它們時調整它以創建節點。深度優先搜索將是最簡單的,因爲您一次只需跟蹤一個節點,但廣度優先搜索可能會更快,但更多的實施困難。