动态规划下的巴什博弈

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;
 }

猜你喜欢

转载自blog.csdn.net/qq_40507857/article/details/81278299
今日推荐