深夜闲着没事干,刷了刷我的粉丝群,看到一位女粉那么晚了还在写代码、改bug,顿时挺感动的:
看她好像代码上遇到了困难,挺想找个男朋友帮忙解决的。
于是我突然编出了一道题目:
女粉有N个bug需要修改,有M个男生,每个男生会修改一部分bug。问:最少要选几个男生当男朋友,才能修完所有bug?(保证每个bug都至少有一个男生会修改)
想了半天我也没想出来咋做,后来一想,这不就可以抽象成一个「集合覆盖问题」吗?
一个集合有N个元素,M个子集,问:最少选几个子集可以覆盖所有元素?
百度一搜,我惊呆了:
这竟然是一个NP-完全问题,也就是不存在多项式时间的解法。
正确的解法就是枚举所有的男生子集,看看选出哪些人做男朋友可以解决所有的bug,这样时间复杂度就是
。
当然也有近似的解法,「一个一个地选择男朋友」。每次从剩下还没选的男生中,选出可以解决最多剩下bug的人作为男朋友。一直到所有bug都被解决了。
这样问题就被完美解决了!男朋友按顺序排队来谈嘛,每次挑优势最大的那个,解决完自己的问题后就可以分了。等遇到新的问题时,继续选择可以解决最多问题的那个当作男朋友。一直到不再有新的问题产生。
没想到普普通通的女粉身上,竟然还蕴藏着这道计算机理论领域经典的NP-完全问题。这也应证了那句老话,「科学来源于生活」。
祝愿这位女粉bug越来越少,代码越来越好,早日超越我。