Posted on 2011-11-01 14:24
C小加 閱讀(1518)
評(píng)論(1) 編輯 收藏 引用 所屬分類:
解題報(bào)告
博弈+DP。
我的博弈很菜啊,看了討論區(qū)才知道該如何博弈,然后就很自然的想到了DP。
先找出石子總數(shù)是1的時(shí)候先手肯定能贏的狀態(tài),然后找2,直至找到n。每一次狀態(tài)的選定都依據(jù)之前的狀態(tài)。
#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;//初始化,當(dāng)沒(méi)有石子的時(shí)候先手必勝
for(int i=1;i<=n;i++)//石子總數(shù)從1枚舉到n
{
for(int j=0;j<m;j++)//枚舉取石子的所有可能性
{
if(i>=a[j]&&f[i-a[j]]==0)//如果先手拿了a[j]數(shù)量的石子,剩下的石子后手必?cái)。敲催@個(gè)狀態(tài)下先手必勝
{
f[i]=1;
break;
}
}
}
cout<<2-f[n]<<endl;
return 0;
}