class Solution:
def canIWin(self, maxChoosableInteger: int, desiredTotal: int) -> bool:
if desiredTotal==0:
return True
dp=[False for _ in range(1<<maxChoosableInteger)]
for i in range((1<<maxChoosableInteger)-1,-1,-1):
s=0
for j in range(maxChoosableInteger):
if ((i>>j)&1)==1:
s+=(j+1)
if s>=desiredTotal:
dp[i]=False
continue
for j in range(maxChoosableInteger):
if ((i>>j)&1)==0 and dp[i+(1<<j)]==False:
dp[i]=True
return dp[0]
# your code goes here
Y2xhc3MgU29sdXRpb246CiAgICBkZWYgY2FuSVdpbihzZWxmLCBtYXhDaG9vc2FibGVJbnRlZ2VyOiBpbnQsIGRlc2lyZWRUb3RhbDogaW50KSAtPiBib29sOgogICAgICBpZiBkZXNpcmVkVG90YWw9PTA6CiAgICAgICAgcmV0dXJuIFRydWUgIAogICAgICBkcD1bRmFsc2UgZm9yIF8gaW4gcmFuZ2UoMTw8bWF4Q2hvb3NhYmxlSW50ZWdlcildCiAgICAKICAgICAgZm9yIGkgaW4gcmFuZ2UoKDE8PG1heENob29zYWJsZUludGVnZXIpLTEsLTEsLTEpOgogICAgICAgIHM9MAogICAgICAgIGZvciBqIGluIHJhbmdlKG1heENob29zYWJsZUludGVnZXIpOgogICAgICAgICAgaWYgKChpPj5qKSYxKT09MToKICAgICAgICAgICAgcys9KGorMSkKICAgICAgICBpZiBzPj1kZXNpcmVkVG90YWw6CiAgICAgICAgICBkcFtpXT1GYWxzZQogICAgICAgICAgY29udGludWUKICAgICAgICBmb3IgaiBpbiByYW5nZShtYXhDaG9vc2FibGVJbnRlZ2VyKToKICAgICAgICAgIGlmICgoaT4+aikmMSk9PTAgYW5kIGRwW2krKDE8PGopXT09RmFsc2U6CiAgICAgICAgICAgIGRwW2ldPVRydWUKICAgICAgICAKICAgICAgcmV0dXJuIGRwWzBdCgojIHlvdXIgY29kZSBnb2VzIGhlcmU=