编辑
2023-11-07
算法题
00
请注意,本文编写于 550 天前,最后修改于 550 天前,其中某些信息可能已经过时。

题目

cpp
class Solution { public: bool canIWin(int maxChoosableInteger, int desiredTotal) { if (desiredTotal <= 0) return true; // 如果所有可选整数的和小于目标值,则无法稳赢 if (maxChoosableInteger * (maxChoosableInteger + 1) / 2 < desiredTotal) return false; // 用于记录状态是否能够稳赢的哈希表 unordered_map<int, bool> memo; // 初始状态为所有整数都未被使用 int used = 0; return canWin(maxChoosableInteger, desiredTotal, used, memo); } bool canWin(int maxInt, int total, int used, unordered_map<int, bool>& memo) { if (memo.count(used)) return memo[used]; for (int i = 1; i <= maxInt; i++) { int mask = 1 << i; if ((used & mask) == 0) { // 当前整数未被使用 if (total <= i || !canWin(maxInt, total - i, used | mask, memo)) { memo[used] = true; // 当前状态能够稳赢 return true; } } } memo[used] = false; // 当前状态无法稳赢 return false; } };

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!