原题链接:https://leetcode.com/problems/can-i-win/
class Solution {
public:
bool canIWin(int maxChoosableInteger, int desiredTotal) {
int status = 0 ;
if (desiredTotal <= 1) return true;
if ((maxChoosableInteger+1)*maxChoosableInteger < desiredTotal*2) return false;// if sum can not >= desiredTotal, here need use sum formula
vector> dp(desiredTotal+1);
return dfs(dp, status, maxChoosableInteger, desiredTotal);
}
bool dfs(vector> &dp, int status, int max_n, int desired) {
if (dp[desired].count(status)) {
return dp[desired][status];
}
for (int i = max_n - 1; i >= 0 ; --i) {
if (!(status & (1<= desired || !dfs(dp, status, max_n, desired-i-1)) {
dp[desired][status] = true;
return true;
}
status ^= (1< 


