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; } };