สมมติว่า เรามีสามรายการที่มีความยาวเท่ากัน สิ่งเหล่านี้คือกำหนดเวลา เครดิต และระยะเวลา พวกเขาเป็นตัวแทนของการมอบหมายหลักสูตร สำหรับกำหนดเวลาการมอบหมายครั้งที่ i[i] แสดงกำหนดเวลา หน่วยกิต[i] แสดงเครดิต และระยะเวลา[i] แสดงจำนวนวันที่ต้องใช้ในการมอบหมายงานให้เสร็จสิ้น งานหนึ่งต้องเสร็จสิ้นก่อนที่จะเริ่มงานอื่น เราต้องจำไว้ว่าเราสามารถทำงานให้เสร็จในวันที่ครบกำหนดและขณะนี้เรากำลังเริ่มต้นวันที่ 0
ดังนั้น หากข้อมูลป้อนเข้า เช่น กำหนดเวลา =[7, 5, 10], หน่วยกิต =[8, 7, 10], ระยะเวลา =[5, 4, 10] ผลลัพธ์จะเป็น 10
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
งาน :=เรียงลำดับรายการ zip(กำหนดเวลา, ระยะเวลา, เครดิต)
-
กำหนดฟังก์ชัน dp()
-
ถ้าฉัน>=ขนาดของงาน แล้ว
-
คืนค่า 0
-
-
ตอบ :=dp(i + 1 วัน)
-
เส้นตาย ระยะเวลา เครดิต :=งาน[i]
-
ถ้าวัน + ระยะเวลา − 1 <=เส้นตายแล้ว
-
ans :=สูงสุดของ ans, dp(i + 1, วัน + ระยะเวลา) + เครดิต
-
-
กลับมาอีกครั้ง
-
จากวิธีหลักส่งคืน dp(0, 0)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
class Solution: def solve(self, deadlines, credits, durations): jobs = sorted(zip(deadlines, durations, credits)) def dp(i=0, day=0): if i >= len(jobs): return 0 ans = dp(i + 1, day) deadline, duration, credit = jobs[i] if day + duration − 1 <= deadline: ans = max(ans, dp(i + 1, day + duration) + credit) return ans return dp() ob = Solution() deadlines = [7, 5, 10] credits = [8, 7, 10] durations = [5, 4, 10] print(ob.solve(deadlines, credits, durations))
อินพุต
[7, 5, 10], [8, 7, 10], [5, 4, 10]
ผลลัพธ์
10