3
vector<vector<int>> dp;4
bool backtrack(int curr, int &maxInt, int &desire, int mask, int player) {5
if (dp[player][mask] != -1) {6
return dp[player][mask];8
for (int i = 1; i <= maxInt; i++) {9
int nmask = (1 << (i - 1));10
if ((mask & nmask) == 0) {11
if (curr + i >= desire or12
!backtrack(curr + i, maxInt, desire, mask + nmask, (player + 1) % 2)) {13
return dp[player][mask] = true;17
return dp[player][mask] = false;22
bool canIWin(int maxChoosableInteger, int desiredTotal) {23
dp = vector<vector<int>>(2, vector<int>(1 << maxChoosableInteger, -1));24
if (maxChoosableInteger * (maxChoosableInteger + 1) / 2 < desiredTotal) {27
int curr = 0, mask = 0;28
return backtrack(curr, maxChoosableInteger, desiredTotal, mask, 0);