C++ Top-Down DP, Bitmasking, no backtracking for finding the nodes
\nvector<vector<int>> memo;\nmap<string,int> index;\nint dp(int mask,int person,int allmask,vector<int> people)\n{\n    if(mask==allmask)\n        return 0;\n  
```\nvector<vector<int>> memo;\nmap<string,int> index;\nint dp(int mask,int person,int allmask,vector<int> people)\n{\n    if(mask==allmask)\n        return 0;\n    if(person>=people.size())\n        return 62;\n    if(memo[mask][person]!=-1)\n        return memo[mask][person];\n    int q=min(1+dp(mask|people[person],person+1,allmask,people),dp(mask,person+1,allmask,people));\n    return memo[mask][person]=q;\n}\nvector<int> smallestSufficientTeam(vector<string>& req_skills, vector<vector<string>>& p) \n{\n    vector<int> people(p.size(),0);\n    int allmask=(1<<req_skills.size())-1;\n    memo.resize(allmask, vector<int>(people.size(), -1));\n    for(int i=0;i<req_skills.size();++i)\n        index[req_skills[i]]=i;\n    for(int i=0;i<p.size();++i)\n    {\n        int mask=0;\n        for(string skill:p[i])\n            mask=mask|1<<index[skill];\n        people[i]=mask;\n    }\n    vector<int> ret;\n    int val=dp(0,0,allmask,people);\n    int mask=0;\n    for(int person=0;person<people.size();++person)\n    {\n        int temp=mask;\n        if(memo[mask][person]>val)\n        {\n            mask=mask|people[person-1];\n            ret.push_back(person-1);\n            val--;\n        }\n        if(person==people.size()-1)\n            if(mask!=allmask&&mask|people[person]==allmask)\n                ret.push_back(person);\n        if(val==0)\n            break;\n    }\n    return ret;\n}\n```
['Dynamic Programming', 'Bit Manipulation', 'Recursion', 'C', 'Bitmask']