题目
https://leetcode.com/problems/smallest-sufficient-team/
有n个数,m个数集,要从中选出k个数集,使得这k个集合的并集包含这n个数。求最小的k。
n <= 16, m <= 60
做法
状态压缩动态规划。设f[S]表示包含集合S中的数的最少集合数。枚举S的每一个子集A,那么f[S] = min(f[A] + f[S - A])。通过给定的m个集合初始化即可。代码如下:
1 | class Solution { |
下面分析时间复杂度。显然我们枚举了n个数的所有子集的所有子集。包含k个数的子集有$C_n^k$个,他们子集都分别有$2^k$个。因此时间复杂度为:
$$\sum_{k=0}^{n}C_n^k\times2^k=C_n^0\times2^0+C_n^1\times2^1+C_n^2\times2^2+…+C_n^n\times2^n$$
高中时学过杨辉三角,可以知道上面这个式子就是$(2+1)^n$的展开式。因此总时间复杂度O($3^n$),$3^{16}=43046721$,四千多万,可以通过。