折半搜索(meet-in-the-middle)

这是有关暴力枚举的算法
先看一道题

洛谷p4799
Bobek有M元钱,共有N场比赛,每场比赛的门票都有一个价格\(C_i\)
问在总票价不超过M元钱的情况下,Bobek共有多少种不同的观赛方案。
注1:若方案1中观看了某场比赛,方案2中未观看该场,则认为两种方案不同。
注2:\(1\leq N\leq 40\) \(0\leq M \leq 10^{18}\)

首先发现这是一类背包问题,复杂度\(O(nm)\),看一眼数据范围,直接T飞
考虑暴力枚举是否观看每场比赛,时间复杂度\(O(2^{N})\),也是不太好卡过
这时我们就要用到折半搜索(meet-in-the-middle)
折半搜索有点像分治算法也就是
把一个大区间分为左右两端,分别统计答案,然后将左右区间合并统计跨左右区间的答案
区别在于分治算法会递归\(logn\)次,而我们的折半搜索只进行一次
对于这题来说就是以\(\frac{N}{2}\)为界限分为\([1,\frac{N}{2}]\)\([\frac{N}{2}+1, N]\)两段
对每段进行暴力枚举,然后合并答案
时间复杂度\(O(2^{\frac{N}{2}})\)

posted @ 2025-11-11 20:40  东东哥本人  阅读(1)  评论(0)    收藏  举报