Tricks

主要记录一些优化算法的小技巧。

折半搜索

一种优化搜索的技巧,往往可以把复杂度由O(2^n)级别优化成O(2*2^{\frac{n}{2}})

例题:

平衡的子集

题意:给定n个物品,每个物品有个权值w,若一个子集可以被分成两个权值和相同的子集,就称该子集是平衡的,求有多少个平衡的子集。(n<=20)

solution:考虑暴力搜索,相当于每个点有个系数0/1/-1,问整个序列权值和为0的方案数,这样搜索是O(3^n)的,无法通过本题。我们可以先O(3^{\frac{n}{2}})的爆搜出前一半能凑出的权值,拿map存起来,然后爆搜后面一半,每次在map里查找。特别注意一个子集的内部的1/-1划分是不算多次的,所以还要开个O(2^n)的数组去重。

总复杂度是O(2*3^{\frac{n}{2}}*logn)

0%