dp[i]表示剩下i个石块时必胜方是谁
如果能保证每一次决策确定一个必胜方,就能递推下去求得最后的胜利者
于是可以只考虑每一次先手是否有必胜策略,若没有则自然后手胜
#include<stdio.h>
#include<string.h>
#define MAXN 1000005
int dp[MAXN];
int cost[15];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=0;i<m;i++)
scanf("%d",&cost[i]);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
for(int j=0;j<m;j++)
if(i-cost[j]>=0&&dp[i-cost[j]]==0)
{
dp[i]=1;
break;
}
printf("%s\n",dp[n]?"Stan wins":"Ollie wins");
}
return 0;
}