Alice和Bob
时间限制: 1 Sec 内存限制: 128 MB
题目描述
Alice和Bob在玩这样的一个游戏, 给定大小为K数组a1,a2,a3……ak。 一开始, 有x枚硬币, Alice和Bob轮流取硬币, 每次所取硬币的枚数一定要在 a1,a2,a3……ak之中。 每局Alice先取, 取走最后一枚硬币的一方获胜。 当双方都采取最优策略的时候, 谁会获胜? 题目假定a1,a2,a3……ak之中一定有1。
输入
本题有多组测试数据。
每组数据第一行是两个数x,k。分别代表开局有X个金币,和大小为K的数组。
随后一行是K个数,表示可以取得数。
输出
对于每组数据,输出赢家是谁
样例输入
4 3
1 3 4
9 3
1 3 4
样例输出
Alice
Bob
#include<bits/stdc++.h>
using namespace std;
#define MAX 10009
bool win[MAX];
int main()
{
ios::sync_with_stdio(false);
int x,k,a[110];
while(cin>>x>>k){//分别代表开局有X个金币,和大小为K的数组。
for(int i=0;i<k;i++)
cin>>a[i];
win[0]=0;//金币个数为0时,先手必败
for(int j=1;j<=x;j++)//枚举所有金币
{
win[j]=0;
for(int i=0;i<k;i++){//枚举所有一次可取的个数
//当j>=a[i]时,只要有一个a[i],使得j-a[i]为必败态,那么j就为必胜态;
if(j>=a[i]&&!win[j-a[i]])
win[j]=1;
}
}
if(win[x]) printf("Alice\n");
else printf("Bob\n");
}
return 0;
}