สมมติว่าเรามีตัวเลข n ดังนั้น ให้พิจารณาว่าไม่มีส้มในครัว และเรากินส้มเหล่านี้ทุกวันโดยรักษากฎเหล่านี้:1. กินส้มลูกเดียว 2. ถ้า n เป็นเลขคู่ ให้กินส้ม n/2 ผล 3. ถ้า n หารด้วย 3 ลงตัวสามารถกินส้ม 2*(n/3) ได้ เราสามารถเลือกได้เพียงตัวเลือกเดียวในแต่ละวัน เราต้องหาจำนวนวันขั้นต่ำที่จะกินส้มได้
ดังนั้นหากอินพุตเท่ากับ n =10 เอาต์พุตจะเป็น 4 เพราะ
-
ในวันที่ 1 กินส้ม 1 ผล 10 - 1 =9
-
วันที่ 2 กินส้ม 6 ผล 9 - 2*(9/3) =9 - 6 =3.
-
วันที่ 3 กินส้ม 2 ผล 3 - 2*(3/3) =3 - 2 =1.
-
วันที่ 4 กินส้มสุดท้าย 1 - 1 =0
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน fun() นี่จะใช้เวลา n
-
ถ้า n อยู่ในบันทึกแล้ว
-
บันทึกช่วยจำ[n]
-
-
ถ้า n<=2 แล้ว
-
กลับ n
-
-
memo[n]:=1 + ขั้นต่ำของ (n mod 2+ fun(quotient of n/2)) และ (n mod 3 + fun(quotient of n/3))
-
บันทึกช่วยจำ[n]
-
จากวิธีหลัก ให้ทำดังนี้
-
บันทึก:=แผนที่ใหม่
-
คืนความสนุก(n)
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น
def solve(n): def fun(n): if n in memo: return memo[n] if n<=2: return n memo[n]=1+min(n%2+fun(n//2),n%3+fun(n//3)) return memo[n] memo={} return fun(n) n = 12 print(solve(n))
อินพุต
7, [5,1,4,3]
ผลลัพธ์
4