端午放假在家,平时上班真的很忙很忙,没有时间休息!而码农放松的最好的办法躺着看电视剧煲电影,有的人是喜欢看电影,有的人是打游戏,当然还有的码农酷爱看动漫。
小编其实三者都喜欢,而且还是一个武侠金庸迷,放假在家翻了翻金庸的电视剧 “飞雪连天射白鹿,笑书神侠倚碧鸳”,每一部都非常经典。最帅的还是古天乐版本的杨过,最羡慕的人物还是鹿鼎记里面的韦小宝。
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 秒
回复「韦小宝」即可获取源码
往期热门干货: