两道基础回溯题
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
void dfs(int k, int n, int start_index, int path_sum) {
if (path.size() == k && path_sum == n) {
res.emplace_back(path);
return;
}
if (path.size() < k && path_sum < n) {
for (int i = start_index; i <= 9; i++) {
path.emplace_back(i);
dfs(k, n, i + 1, path_sum + i);
path.pop_back();
}
}
}
vector<vector<int>> combinationSum3(int k, int n) {
dfs(k, n, 1, 0);
return res;
}
};
class Solution {
public:
vector<string> map {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
string path = "";
vector<string> res;
void dfs(const string& digits, int index) {
if (digits.size() == index) {
res.emplace_back(path);
return;
}
int digit = digits[index] - '0';
string letters = map[digit];
for (int i = 0; i < letters.size(); i++) {
path.push_back(letters[i]);
dfs(digits, index + 1);
path.pop_back();
}
}
vector<string> letterCombinations(string digits) {
if (digits.size() == 0) return res;
dfs(digits, 0);
return res;
}
};
状态压缩dp,有点难,深度搜索超时
class Solution:
def smallestSufficientTeam(self, req_skills: List[str], people: List[List[str]]):
sid = {s: i for i, s in enumerate(req_skills)}
n = len(people)
mask = [0] * n
for i, skills in enumerate(people):
for s in skills:
mask[i] |= 1 << sid[s]
@cache
def dfs(i, j):
if j == 0:
return 0
if i < 0:
return (1 << n) - 1
# 不选 mask[i]
res = dfs(i - 1, j)
res2 = dfs(i - 1, j & ~mask[i]) | (1 << i)
return res if res.bit_count() < res2.bit_count() else res2
res = dfs(n - 1, (1 << len(req_skills)) - 1)
return [i for i in range(n) if (res >> i) & 1]