1125. Smallest Sufficient Team Solution 1 (time O(m2^n), space O(m2*n)) # Dynamic programming class Solution(object): def smallestSufficientTeam(self, req_skills, people): """ :type req_skills: List[str] :type people: List[List[str]] :rtype: List[int] """ n, m = len(req_skills), len(people) skill_index = {v: i for i, v in enumerate(req_skills)} dp = [None] * (1 << n) dp[0] = [] for i, p in enumerate(people): cur_skill = 0 for s in p: cur_skill |= 1 << skill_index[s] for prev in range(1 << n): if dp[prev] is None: continue comb = prev | cur_skill if dp[comb] is None or len(dp[comb]) > len(dp[prev]) + 1: dp[comb] = dp[prev] + [i] return dp[(1 << n) - 1]