package com.算法专练.力扣.我能赢吗;
import java.util.HashMap;
import java.util.Map;
/**
* @author xnl
* @Description:
* @date: 2022/5/22 21:25
*/
public class Solution {
public static void main(String[] args) {
Solution solution = new Solution();
System.out.println();
}
// 记忆数组,记录是否使用过
Map<Integer, Boolean> memo = new HashMap<>(16);
public boolean canIWin(int maxChoosableInteger, int desiredTotal) {
if ((1 + maxChoosableInteger) * maxChoosableInteger / 2 < desiredTotal){
return false;
}
return dfs(maxChoosableInteger, 0, desiredTotal, 0);
}
/**
*
* @param maxChoosableInteger 最大值
* @param usedNumbers 当前选择的值
* @param desiredTotal 总和
* @param currentTotal 当前选择的和
* @return
*/
public boolean dfs(int maxChoosableInteger, int usedNumbers , int desiredTotal, int currentTotal){
if (!memo.containsKey(usedNumbers)){
boolean res = false;
for (int i = 0; i < maxChoosableInteger; i++){
if (((usedNumbers >> i) & 1) == 0) {
if (i + 1 + currentTotal >= desiredTotal){
res = true;
break;
}
if (!(dfs(maxChoosableInteger, usedNumbers | (1 << i), desiredTotal, i + 1 + currentTotal))){
res = true;
break;
}
}
}
memo.put(usedNumbers, res);
}
return memo.get(usedNumbers);
}
}
答案是这个,我看的是官网给的答案,思路理解很简单,就是枚举所有的情况,但是有两处我不能理解
1. (((userNumber >> i ) & 1 ) ==0 ) 这个为啥能判断这个数已经被使用过
2.userNumber | (1 >> i) 为什么又可以表示下一个数