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,必赢
2,必赢
3,必赢
4,必输
5,可赢
6,可赢
7,可赢
8,对方可赢,我方必输
9,可赢
10,可赢,
当n = 4,8,12,16,等4的倍数时,对方可想到最优解,我方必是输局。
bool NimGame(int n ){ return (n % 4); }