Mô tả bài toán
Có n phòng ký túc xá. Sinh viên muốn chuyển phòng, đặt yêu cầu [from, to]. Yêu cầu chỉ được thỏa mãn nếu có sinh viên khác nhận phòng cũ. Tìm số yêu cầu tối đa có thể thỏa mãn cùng lúc.
Ví dụ
n = 3, requests = [[0,2],[1,0],[2,1]] -> 3 (chu trình 0->2, 1->0, 2->1).
Giải thuật (Brute Force Subset)
- Duyệt
ktừlen(requests)xuống 1. - Với mỗi tổ hợp
kyêu cầu: kiểm tra cân bằng net flow tại mỗi phòng (số vào = số ra). - Nếu tìm thấy tổ hợp cân bằng -> trả về
k.
Triển khai Python
from itertools import combinations
def solve(n, requests):
for k in range(len(requests), 0, -1):
for c in combinations(range(len(requests)), k):
d = [0] * n
for i in c:
d[requests[i][0]] -= 1
d[requests[i][1]] += 1
if not any(d):
return k
return 0
print(solve(3, [[0, 2], [1, 0], [2, 1]]))
Đầu vào
3, [[0,2],[1,0],[2,1]]
Đầu ra
3