Posted on 2011-11-01 14:24
C小加 阅读(1457)
评论(1) 编辑 收藏 引用 所属分类:
解题报告
博弈+DP。
我的博弈很菜啊,看了讨论区才知道该如何博弈,然后就很自然的想到了DP。
先找出石子总数是1的时候先手肯定能赢的状态,然后找2,直至找到n。每一次状态的选定都依据之前的状态。
#include <iostream>
#include <cstring>
using namespace std;
const int MAXM=53;
const int MAXN=10003;
int a[MAXM];
int f[MAXN];
int main()
{
memset(f,0,sizeof(f));
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++)
{
cin>>a[i];
}
f[0]=1;//初始化,当没有石子的时候先手必胜
for(int i=1;i<=n;i++)//石子总数从1枚举到n
{
for(int j=0;j<m;j++)//枚举取石子的所有可能性
{
if(i>=a[j]&&f[i-a[j]]==0)//如果先手拿了a[j]数量的石子,剩下的石子后手必败,那么这个状态下先手必胜
{
f[i]=1;
break;
}
}
}
cout<<2-f[n]<<endl;
return 0;
}