Alice和Bob在玩这样一个游戏。给定k个数字a[1],a[2],…,a[k]。一开始,有x枚硬币,Alice和Bob轮流取硬币。每次所取硬币的枚数一定要在a[1],a[2],…,a[k]当中。Alice先取,取走最后一枚硬币的一方获胜。当双方都采取最优策略时,谁会获胜?题目假定a[1],a[2],…,a[k]中一定有1。
限制条件:
1<=x<=10000
1<=k<=100
1<=a[i]<=x
输入:
x=9
k=2
a={1,4}
输出:
Alice
如果你要取得时候,硬币为0,那么你必败
如果你取得时候不为0,并且存在当前硬币数减去一个数字等于0,那么你必胜。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#define maxn 500
using namespace std;
int val[10000];
int n,k;
int a[10000];
int main()
{
cin>>n>>k;
for(int i=0;i<k;i++)
cin>>a[i];
val[0]=0; //硬币数为0时,必败
for(int i=1;i<=n;i++)//硬币数为i时
{
val[i]=0;//先假设必败
for(int j=0;j<k;j++)//遍历数字
{
if(a[j]<=i)//当前数字必须小于硬币数
{
if(val[i-a[j]]==0)//我们想要硬币i时并且取走a【j】必胜,我们就要必须保证i-a[j]个硬币是必败的,因为这个时候如果不是必败的,也就是对方不是必败的,对方就可能赢,我们j就不是必胜的了
{
val[i]=1;
break;
}
}
}
}
if(val[n])
{
cout<<"Alice"<<endl;
}
else
{
cout<<"Bob"<<endl;
}
}