4. Một số bài toán ví dụ
4.2.2. Kế hoạch thuê nhân công
(Nguồn bài: thầy Nguyễn Đức Nghĩa, 2001)
Một dự án phần mềm cần triển khai trong tháng đánh số từ 1 tới . Biết rằng:
Bắt đầu vào một tháng, dự án có quyền thuê thêm nhân công. Để thuê mỗi nhân công cần một khoản chi phí (trả cho nhà tuyển dụng).
Mỗi nhân công được thuê sẽ được trả một khoản lương mỗi tháng kể cả khi không làm việc.
Kết thúc một tháng, dự án có quyền sa thải nhân công. Để sa thải mỗi nhân công cần trả một khoản chi phí .
Không có nhân công nào trước khi dự án bắt đầụ Mỗi tháng cần tối thiểu nhân công. Kết thúc tháng thứ , toàn bộ nhân công phải bị sa thảị
Yêu cầu: Hãy giúp ông giám đốc dự án xây dựng kế hoạch thuê nhân công để dự án được hoàn thành với chi phí thuê nhân công ít nhất có thể.
Dữ liệu: Vào từ file văn bản PROJECT.INP
Dòng 1 chứa số tháng ( )
Dòng 2 chứa ba số nguyên dương ( )
Dòng 3 chứa số nguyên dương ( )
Kết quả: Ghi ra file văn bản PROJECT.OUT
Dòng 1: Ghi chi phí tối thiểu tìm được
Dòng 2: Ghi số, số thứ là số nhân công làm trong dự án tại tháng thứ
PROJECT.INP PROJECT.OUT 3 3 4 5 6 10 9 11 265 10 10 11
Gợi ý lời giải:
Lời giải dựa trên thuật toán tham lam:
Ở tháng 1 ta sẽ thuê đúng , giả sử trong phương án tối ưu ta có nhân công ở tháng thứ , ta sẽ quyết định xem ta sẽ thuê thêm hay sa thải bớt nhân công khi kết thúc tháng .
Gọi ⌊ ⌋, gọi là ngưỡng sa thải, tức là nếu một nhân công không làm việc nhiều hơn tháng thì sa thải nhân công đó rồi sau này thuê lại sẽ có chi phí thấp hơn. Vậy từ khi kết thúc tháng , ta xét xa hơn về sau tháng: từ tháng tới tháng , nếu nhu cầu nhân công tháng cao nhất trong phạm vi đó là thì:
Nếu , ta sẽ giữ nguyên nhân công trong tháng
Nếu , ta sa thải bớt nhân công vì những nhân công này sẽ ngồi không nhiều hơn tháng.
Việc tính nhu cầu nhân công tháng cao nhất trong phạm vi từ tháng tới tháng có thể thực hiện hiệu quả bởi cây quản lý phạm vi một chiềụ Thời gian thực hiện giải thuật ( ).
Chương trình: PROJECT.PAS
Cách khác: Có thể sử dụng Heap để tính max, nhưng cài đặt sẽ khó hơn.