端午放假在家,平時上班真的很忙很忙,沒有時間休息!而碼農放鬆的最好的辦法躺着看電視劇煲電影,有的人是喜歡看電影,有的人是打遊戲,當然還有的碼農酷愛看動漫。
小編其實三者都喜歡,而且還是一個武俠金庸迷,放假在家翻了翻金庸的電視劇 “飛雪連天射白鹿,笑書神俠倚碧鴛”,每一部都非常經典。最帥的還是古天樂版本的楊過,最羨慕的人物還是鹿鼎記裏面的韋小寶。
01.小寶的7個老婆
韋小寶有7個老婆,每一個老婆都是如花似玉,才藝非凡,都有自己的技能和亮點,我大概列了一個表格:
如果現在給韋小寶出一道題目,如果只能選擇最少個數的老婆來滿足所有的技能,應該怎麼選。就是佔據了顏值高,脾氣好,有智慧,武功高,有社會地位,而且還溫柔善良。
是不是很麻煩該怎麼選擇呢?今天我們用Python大法來幫小寶一把,看我Python大法如何解決~
02.數據結構設計
我們需要把上面的表格裏面的數據轉爲計算機的數據結構,我們用列表來存儲數據。分別列了技能,老婆的名字和每個老婆擁有的技能,大致如下:
Talents爲技能樹
wives爲老婆的名字
WifeTalents爲每個老婆的技能列表
這裏用了一個嵌套列表,注意這個嵌套列表的順序和上面的老婆的名字一一對應。
看起來裏面最弱的應該是建寧公主,她僅僅佔據了社會地位這一點,其他的武功,性格,智慧好像都不行。而雙兒應該是奪冠的熱門對象,溫柔又體貼,還會做飯,武功也高。那麼到底用程序算出來的結果是怎麼樣呢,我們拭目以待~
03.算法來也
1).首先,設定搜索的空間
小寶有7個老婆,我們可以選擇或者不選擇其中的每一位佳人。每位佳人對應的就是兩種選擇,因爲搜索的空間爲2**n ,7個老婆的搜索空間就是2的7次方,比如:
假設7個人爲A,B,C,D,E,F,G
[]
[A][B][C][D][E][F][G]
[AB][AC][AD][AE]...
[ABC][ABD][ABE]...
[ABCD][ABCE]...
...
限於篇幅,我就不完全展開了所有的組合情況。
2).接着,設計一個函數來檢查技能
我們上面有這麼多組合,我們接着我們設計一個函數來專門檢查,是否缺少一門技,如果缺少一門技能絕活,說明這個不是正確的組合,需要拋棄。
如果我們檢查了所有的技能絕活且在所有的迭代中都沒有返回False,意味着該組合覆蓋了所有的絕活,則返回True.
03.主函數設計
這裏是7個老婆,wifeList爲7,我們用 result來暫時存儲,起始的值爲完整的7個老婆;
然後我們設計一個搜索空間2的n次方,num=i爲對應的組合;
接着用前面設計的excellent函數來檢查這個組合是否覆蓋了所有的技能絕活;如果滿足了,則與當前已知最優的老婆組合進行比較,如果人數少,則更新最優組合;
最後運行一下代碼,看看計算機算出來的,最佳老婆組合是什麼:
答案竟然是蘇荃,建寧公主,曾柔 ,也就是說選擇了這3個老婆就可以佔全了所有的技能列表。我們來看一下:
確實從圖標上看 蘇荃,建寧公主,曾柔 可以佔滿技能樹!但是竟然沒有雙兒,溫柔可人,武功高強的雙兒竟然落選了。天哪,小編第一個表示不服氣,小夥伴們你們服氣嗎,趕緊在留言區寫下你的評論。
需要本次源碼的繼續研究的,可以在文末獲取。
????長按上方二維碼 2 秒
回覆「韋小寶」即可獲取源碼
往期熱門乾貨: