# [1255. Maximum Score Words Formed by Letters](https://leetcode.com/problems/maximum-score-words-formed-by-letters/description/) # 1. Tóm tắt đề bài Cho một danh sách các từ $words$, và danh sách các ký tự $letters$, và $score$ tương ứng với điểm số của từng ký tự. Ta cần chọn ra một tập con $w$ trong danh sách $words$ thỏa mãn: - Có thể sử dụng các ký tự trong danh sách $letters$ để tạo ra tất cả các từ trong $w$, mỗi ký tự trong $letters$ được sử dụng một lần. - Tổng số điểm của các ký tự được sử dụng là cao nhất có thể. (Nếu sử dụng ký tự thứ $i$ trên bảng chữ cái, sẽ được cộng $score_i$ điểm). ##### Giới hạn $1 \le |words| \le 14$ $1 \le |words[i]| \le 15$ $1 \le |letters| \le 100$ $0 \le score_i \le 10$ # 2. Tóm tắt lời giải **Độ phức tạp dự tính: $O(2 ^ {|words|} * \Sigma(words_i))$** Bài toán này chính là bài toán chọn tập hợp con tối ưu, từ tập hợp cha chính là $words$. Ta nhận thấy: $|words| \le 14$, vì vậy, ta có thể duyệt toàn bộ tập con của nó ($2^{14}$ tập hợp). Với mỗi tập hợp con, ta có thể tính xem có đủ chữ trong $letters$ cho nó không, và tính tổng số điểm của các ký tự được sử dụng. # 3. Lời giải chi tiết Từ ý tưởng, ta có thể xử lý bài toán này giống như bài chọn subset bình thường. Các bạn lưu ý ở đoạn code của mình sẽ sử dụng mảng $remain$ để lưu số lượng các ký tự còn lại trong $letters$, cũng như sẽ sử dụng một biến $ok$ để kiểm tra xem trong mảng $remain$ còn đủ chữ để chọn từ hiện tại không. Code mẫu: https://leetcode.com/problems/maximum-score-words-formed-by-letters/submissions/1266421049/ ### Độ phức tạp thuật toán Thời gian: $O(2 ^ {|words|} * \Sigma(words_i))$ Bộ nhớ mở rộng: $O(n)$ # 4. Kết luận & Gợi ý mở rộng Các bạn có thể xem các bài cơ bản hơn để duyệt subset: [78. Subsets](https://leetcode.com/problems/subsets/description/) [90. Subsets II](https://leetcode.com/problems/subsets-ii/description/) [2151. Maximum Good People Based on Statements](https://leetcode.com/problems/maximum-good-people-based-on-statements/description/)