您的位置:首页 > 其它

硬币游戏1

2017-08-09 17:38 274 查看
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。

从后往前递推状态,从小到大确定剩余石子的数量为i的时候的状态,他的前一个状态只要能出现必败态当前就一定是必胜的状态。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
int x , k;
int a[1000];
bool win[1000];

void solve()
{
for(int i = 0 ; i <= x ;i++)
{
win[i] = false;
for(int j = 0 ; j < k ; j++)
{
win[i] |= (!win[i-a[j]] && a[j]<=i);
}
}
}

int main()
{
cin >> x >> k;
for(int i = 0 ; i < k ; i++)
{
cin >> a[i];
}
solve();
if(win[x]) cout << "Alice" << endl;
else cout << "Bob" << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: