Trò chơi hai người với n viên bi. Mỗi lượt, người chơi phải lấy số viên bi là số chính phương dương. Người không lấy được thì thua. Bạn đi trước và chọn tối ưu. Xác định có thắng được hay không.
Ví dụ: n = 14 → True (lấy 9, đối thủ lấy tối đa 4, bạn lấy 1 còn lại).
Giải thuật (Đệ quy + Memoization)
- Nếu
n <= 0trả vềFalse - Duyệt
itừint(sqrt(n))xuống 1 - Nếu
i*i > nthì break ans = ans OR (not solve(n - i*i))- Nếu
ansthànhTruethì trả về ngay
Ví dụ triển khai
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 or (not solve(n - i * i))
if ans:
return ans
return ans
print(solve(14))
Đầu vào
14
Đầu ra
True