สมมติว่าเราเล่นเกม 2 คน มีลูกปัด n ลูก ในแต่ละรอบ ผู้เล่นต้องหยิบลูกปัดจำนวนที่เป็นจำนวนกำลังสองบวก หากผู้เล่นไม่สามารถหยิบได้ จะแพ้ กำหนดจำนวน n เราต้องหาว่าสามารถชนะเกมได้หรือไม่ เราเล่นก่อนและเลือกจำนวนลูกปัดอย่างเหมาะสม
เช่น ถ้าอินพุตคือ 14 ผลลัพธ์จะเป็น True เพราะในรอบแรกเราหยิบ 9 ลูก เหลือ 5 ลูก คู่แข่งหยิบได้สูงสุด 4 ลูก เหลือ 1 ลูก รอบต่อมาเราหยิบลูกสุดท้าย เหลือ 0 คู่แข่งไม่สามารถเล่นได้ เราชนะ
ขั้นตอนการแก้ปัญหา
- ถ้า
n <= 0คืนค่าFalse ans := False- สำหรับ
iในช่วงint(sqrt(n))ลงถึง1:- ถ้า
i * i > nออกจากลูป ans := ans OR (not solve(n - i * i))- ถ้า
ansเป็นTrueคืนค่าans
- ถ้า
- คืนค่า
ans
ตัวอย่างการใช้งาน
from math import sqrt
def solve(n):
if n <= 0:
return False
ans = False
for i in range(int(sqrt(n)), 0, -1):
if i * i > n:
break
ans = ans | (not solve(n - i * i))
if ans:
return ans
return ans
print(solve(14))
อินพุต
14
เอาต์พุต
True