描述: 只有一堆n个物品,两个人从轮流中取出(1~m)个;最后取光者胜。
首先, 两个人每次取都是取最优的方法。由题意得,当n=m+1时,无论第一个人取多少物品,最后第二个人会吧所有的物品全部取走总而获得胜利。进一步我们发现 若 n=k*(m+1)+r; 先取者拿走 r 个,那么后者再拿(1~m)个, n=(k-1)*(m+1)+s; 先取者再拿走s 个 最后总能造成 剩下n=m+1 的局面。
所以保持给对方留下(m+1)*k,这样之后,无论对手取走多少个,到最后我都能给对方留下(m+1)个,这样就一定能赢。
因此当n=(m+1)*k时,先取者一定会输。相反,则先取者一定会赢!!
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int n,m;
printf("物品个数:");
scanf("%d",&n);
printf("最多取的个数:");
scanf("%d",&m);
if(n%(m+1)==0){
printf("后取物品的人一定能赢!\n");
}
else
printf("先取物品的人一定能赢!\n");
}