题意:S个石头,双方n个人,每个人最多可以一次拿Si个石头,问先手有没有必胜策略
思路:记忆化搜素+组合博弈。(枚举出所有的情况)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 30
#define M 10000
using namespace std;
int f[N][M],a[N],n,m;
// 1为败 0为胜
int dfs(int x,int y)
{
if(f[x][y]!=-1) return f[x][y]; //判断是否经历过
for(int i=max(0,y-a[x]);i<y;i++) // 记忆化搜索枚举剩多少石子
if(!dfs((x+1)%n,i)) // 如果是后一点N态,则当前点P态
return f[x][y]=1;
return f[x][y]=0; // 如果后一点全都是P态,则当前点为N点
}
int main()
{
while(scanf("%d",&n)==1&&n!=0)
{
n<<=1;scanf("%d",&m);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
memset(f,-1,sizeof(f));
for(int i=0;i<n;i++) f[i][0]=1;
if(dfs(0,m)) puts("1");
else puts("0");
}
}