สมมติว่ามีผู้เล่นสองคนคือ Amal และ Bimal พวกเขากำลังเล่นเกม และโดยที่ Amal จะเริ่มก่อน ในขั้นต้น มีก้อนหินที่แตกต่างกันในกอง ในเทิร์นของผู้เล่นแต่ละคน เขาทำการเคลื่อนไหวโดยนำหินจำนวนสี่เหลี่ยมจัตุรัส (ที่ไม่ใช่ศูนย์) ออกจากกอง นอกจากนี้ หากผู้เล่นคนใดไม่สามารถเคลื่อนไหวได้ เขาจะแพ้เกม ดังนั้นหากเรามี n เราต้องตรวจสอบว่า Amal สามารถชนะเกมได้หรือไม่
ดังนั้น หากอินพุตเป็น n =21 เอาต์พุตจะเป็น True เพราะในตอนแรก Amal สามารถรับ 16 ได้ จากนั้น Bimal รับ 4 จากนั้น Amal รับ 1 และชนะเกม
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
สี่เหลี่ยม :=รายการใหม่
-
สี่เหลี่ยม :=1
-
เพิ่มขึ้น :=3
-
ในขณะที่กำลังสอง <=n ทำ
-
ใส่สี่เหลี่ยมที่ส่วนท้ายของสี่เหลี่ยม
-
สี่เหลี่ยม :=สี่เหลี่ยม + เพิ่มขึ้น
-
เพิ่มขึ้น :=เพิ่มขึ้น + 2
-
-
ใส่สี่เหลี่ยมที่ส่วนท้ายของสี่เหลี่ยม
-
dp :=รายการขนาดว่าง (n + 1)
-
dp[0] :=เท็จ
-
สำหรับ k ในช่วง 1 ถึง n ทำ
-
s :=0
-
dp[k] :=เท็จ
-
ในขณะที่ squares[s] <=k และ dp[k] ว่างเปล่า ให้ทำ
-
ถ้า dp[k - squares[s]] ว่างเปล่า แสดงว่า
-
dp[k] :=จริง
-
-
s :=s + 1
-
-
-
ส่งคืนองค์ประกอบสุดท้ายของ dp
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น
def solve(n): squares = [] square = 1 increase = 3 while square <= n: squares.append(square) square += increase increase += 2 squares.append(square) dp = [None] * (n + 1) dp[0] = False for k in range(1, n + 1): s = 0 dp[k] = False while squares[s] <= k and not dp[k]: if not dp[k - squares[s]]: dp[k] = True s += 1 return dp[-1] n = 21 print(solve(n))
อินพุต
21
ผลลัพธ์
True