这题和博弈有关。dp[]储存结果,0表示后取胜,1表示先取胜,而dp[i]取决于它的“前驱”。举个例子吧,可取的石子数为1,3,8,则19的前驱为18、16、11,如果这个状态都为1,那么19的状态为0;只要有一个为0,19的状态就是1。其实我写的代码是有问题的,可能会导致溢出,可是A了,说明UVA的测试数据还不够大吧。

 

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define MAXN 1000005
 4 bool dp[MAXN];
 5 int a[12];
 6 int main()
 7 {
 8     int n,m,i,j;
 9     while(~scanf("%d%d",&n,&m))
10     {
11         memset(dp,0,sizeof(dp));
12         for(i = 0; i < m; i++)
13         {
14             scanf("%d",&a[i]);
15             dp[a[i]] = 1;
16         }
17         for(j = 1; j <= n; j ++)
18             for(i = 0; i < m; i++)
19                 if(!dp[j])
20                     dp[j+a[i]] = 1;
21         if(dp[n] == 1)
22             printf("Stan wins\n");
23         else
24             printf("Ollie wins\n");
25     }
26     return 0;
27 }