464. Can I Winhtml
https://www.cnblogs.com/grandyang/p/6103525.htmlspa
用递归的方式进行搜索,用hash表减小搜索的次数。由于数字不超过20,因此能够用一个int的位来表示是否访问过。code
注意:htm
(cur & used) == 0这个地方必须加括号,否则就报错了。blog
class Solution { public: bool canIWin(int maxChoosableInteger, int desiredTotal) { if(maxChoosableInteger >= desiredTotal) return true; if((1 + maxChoosableInteger) * maxChoosableInteger/2 < desiredTotal) return false; unordered_map<int,bool> m; return canIWin(maxChoosableInteger,desiredTotal,0,m); } bool canIWin(int maxChoosableInteger, int desiredTotal,int used,unordered_map<int,bool>& m){ if(m.find(used) != m.end()) return m[used]; for(int i = 1;i <= maxChoosableInteger;i++){ int tmp = 1 << (i-1); if((tmp&used) == 0){ if(desiredTotal <= i || !canIWin(maxChoosableInteger,desiredTotal - i,used|tmp,m)){ m[used] = true; return true; } } } m[used] = false; return false; } };