state = state | (1 << i)(state & (1 << i)) != 0 // 表示位标记// 464. 我能赢吗? https://leetcode-cn.com/problems/can-i-win/// 记忆化dfs、博弈class Solution {public: map<pair<int, int>, bool> mp; // <state, sum>, ret bool canIWin(int maxChoosableInteger, int desiredTotal) { if ((1 + maxChoosableInteger) * maxChoosableInteger / 2 < desiredTotal) { return false; } for (int i = 1; i <= maxChoosableInteger; i++) { if (dfs(maxChoosableInteger, desiredTotal, 1 << i, i)) { return true; } } return false; } bool dfs(int maxChoosableInteger, int desiredTotal, int state, int sum) { if (sum >= desiredTotal) { return true; } if (mp.count({state, sum})) { return mp[{state, sum}]; } bool ret = true; for (int i = 1; i <= maxChoosableInteger; i++) { if ((state & (1 << i)) != 0) { continue; } if (dfs(maxChoosableInteger, desiredTotal, (state | (1 << i)), sum + i) == true) { ret = false; // 后手赢了,表示当前手输了,返回false break; } } mp[{state, sum}] = ret; return ret; }};