n=1,2,3,时直接全拿走,必然获胜。n=4时,无论拿1,2,3个,留给对方的必然可以使对方获胜,己方输。
剩余i个时,应考虑的是拿走j(1<=j<=3)个时留下的个数能否使对方必输,那么己方就会赢。
bool NimGame(int n ) {
    if(n < 4)
        return true;
    bool* dp = (bool*)malloc(sizeof(bool)*(n+1));
    int i = 0, j = 0;
    dp[1] = true, dp[2] = true, dp[3] = true;
    for(i = 4; i <= n; i++){
        for(j = 1; j < 4; j++)
            if(!dp[i-j] == true)  //对方必输时
                dp[i] = true;   //己方才会赢
    }
    return dp[n];
}
这个方法对于n过大时会内存超限,但其实仔细分析后可找出简单规律
1
1,必赢
2,必赢
3,必赢
4,必输
5,可赢
6,可赢
7,可赢
8,对方可赢,我方必输
9,可赢
10,可赢,
当n = 4,8,12,16,等4的倍数时,对方可想到最优解,我方必是输局。
bool NimGame(int n ){
    return (n % 4);
}