Mô tả bài toán
Cho mảng jobs (thời gian mỗi việc) và k người làm. Mỗi việc giao cho đúng 1 người. Thời gian làm của người = tổng thời gian việc được giao. Tìm giá trị nhỏ nhất có thể của thời gian làm lớn nhất.
Ví dụ
jobs = [2,1,3,8,5], k = 2 -> 10 (Người 1: 2+5+3=10, Người 2: 1+8=9).
Giải thuật (Backtracking + Pruning)
- Sắp xếp
jobsgiảm dần. - Gán
kviệc đầu chokngười. - Đệ quy
dp(i, assign): gán việcicho từng người, cập nhậtassign, gọi đệ quyi+1. - Cắt tỉa: nếu max(assign) >= ans hiện tại thì dừng nhánh đó.
Triển khai Python
def solve(jobs, k):
jobs.sort(reverse=True)
assign = tuple(jobs[:k])
jobs = jobs[k:]
def dp(i, assign):
if i == len(jobs):
return max(assign)
ans = float('inf')
for x in range(k):
assign = list(assign)
assign[x] += jobs[i]
ans = min(ans, dp(i + 1, tuple(assign)))
assign[x] -= jobs[i]
return ans
return dp(0, assign)
jobs = [2, 1, 3, 8, 5]
k = 2
print(solve(jobs, k))
Đầu vào
[2,1,3,8,5], 2
Đầu ra
10