ได้รายการทักษะที่จำเป็น req_skills และรายการคน people (แต่ละคนมีลิสต์ทักษะ) หาทีมขนาดเล็กที่สุด (ดัชนีคน) ที่รวมกันมีทักษะครบทุกอย่างใน req_skills
ตัวอย่าง
req_skills = ["java","flutter","android"], people = [["java"],["android"],["flutter","android"]] → ทีม [0, 2] (คน 0 มี java, คน 2 มี flutter+android)
ขั้นตอนการแก้ปัญหา (DP + Bitmask)
- Map ทักษะ → บิต:
skill_to_bit = {skill: i} dp[mask] = รายการคนที่ทำให้ได้ทักษะmaskเริ่มdp[0] = []- วนแต่ละคน: คำนวณ
person_maskจากทักษะของเขา - วน
dpที่มีอยู่:new_mask = mask | person_maskถ้าnew_maskไม่มี หรือทีมใหม่สั้นกว่า → อัปเดต - คืน
dp[(1<(Mask ที่มีทุกบิตเป็น 1)
การติดตั้งใน Python
class Solution:
def smallestSufficientTeam(self, req_skills, people):
skill_to_bit = {s: i for i, s in enumerate(req_skills)}
dp = {0: []}
for i, p in enumerate(people):
person_mask = 0
for skill in p:
person_mask |= 1 << skill_to_bit[skill]
for mask, team in list(dp.items()):
new_mask = mask | person_mask
if new_mask == mask:
continue
if new_mask not in dp or len(dp[new_mask]) > len(team) + 1:
dp[new_mask] = team + [i]
return dp[(1 << len(req_skills)) - 1]
ob = Solution()
print(ob.smallestSufficientTeam(
["java","flutter","android"],
[["java"],["android"],["flutter","android"]]
)) # [0, 2]
อินพุต / เอาต์พุต
Input: req_skills=["java","flutter","android"], people=[["java"],["android"],["flutter","android"]] Output: [0, 2]