1. state = state | (1 << i)
    2. (state & (1 << i)) != 0 // 表示位标记
    3. // 464. 我能赢吗? https://leetcode-cn.com/problems/can-i-win/
    4. // 记忆化dfs、博弈
    5. class Solution {
    6. public:
    7. map<pair<int, int>, bool> mp; // <state, sum>, ret
    8. bool canIWin(int maxChoosableInteger, int desiredTotal) {
    9. if ((1 + maxChoosableInteger) * maxChoosableInteger / 2 < desiredTotal) {
    10. return false;
    11. }
    12. for (int i = 1; i <= maxChoosableInteger; i++) {
    13. if (dfs(maxChoosableInteger, desiredTotal, 1 << i, i)) {
    14. return true;
    15. }
    16. }
    17. return false;
    18. }
    19. bool dfs(int maxChoosableInteger, int desiredTotal, int state, int sum)
    20. {
    21. if (sum >= desiredTotal) {
    22. return true;
    23. }
    24. if (mp.count({state, sum})) {
    25. return mp[{state, sum}];
    26. }
    27. bool ret = true;
    28. for (int i = 1; i <= maxChoosableInteger; i++) {
    29. if ((state & (1 << i)) != 0) {
    30. continue;
    31. }
    32. if (dfs(maxChoosableInteger, desiredTotal, (state | (1 << i)), sum + i) == true) {
    33. ret = false; // 后手赢了,表示当前手输了,返回false
    34. break;
    35. }
    36. }
    37. mp[{state, sum}] = ret;
    38. return ret;
    39. }
    40. };