มีงานบ้าน 3 ลิสต์: deadlines, credits, durations (ความยาวเท่ากัน) งาน i: ต้องเสร็จก่อน deadlines[i] ได้ credits[i] ใช้เวลา durations[i] วัน ทำทีละงาน เริ่มวัน 0 หา credit สูงสุด
ตัวอย่าง
deadlines = [7, 5, 10], credits = [8, 7, 10], durations = [5, 4, 10]
Output: 10
เลือกงานที่ 3 (duration 10, deadline 10, credit 10) หรืองาน 1+2 (5+4=9 ≤ deadline 5,7)
แนวทางแก้ปัญหา
DP + Sort by Deadline (Weighted Interval Scheduling):
- รวมเป็น jobs =
(deadline, duration, credit)เรียงตาม deadline - DP:
dp(i, day)= max credit จากงาน i เป็นต้นไป เริ่มวันที่day - Transition: ข้ามงาน i, หรือ ทำงาน i (ถ้า
day + duration - 1 ≤ deadline)
การใช้งาน (Python - Memoized)
from functools import lru_cache
class Solution:
def solve(self, deadlines, credits, durations):
jobs = sorted(zip(deadlines, durations, credits))
@lru_cache(None)
def dp(i, day):
if i >= len(jobs):
return 0
# Option 1: skip
ans = dp(i + 1, day)
# Option 2: take
deadline, duration, credit = jobs[i]
if day + duration - 1 <= deadline:
ans = max(ans, dp(i + 1, day + duration) + credit)
return ans
return dp(0, 0)
# ทดสอบ
ob = Solution()
print(ob.solve([7, 5, 10], [8, 7, 10], [5, 4, 10])) # Output: 10
ความซับซ้อน
- Time Complexity: O(N × MaxDay) - pseudo-polynomial
- Space Complexity: O(N × MaxDay)
สำหรับค่า deadline ใหญ่ ควรใช้ DP แบบ compress state หรือ greedy + heap (ถ้า duration=1)