Nim
题目大意:多组数据,两人轮流操作,n轮一循环,给出总石子数和这n轮每次两人能取的石子上限(下限为1)。取到最后一颗者输。
/* f[i][j]表示在第i轮中一共有j个石子,先行者是否必胜 由于是取到最后一个的人输,那么如果一个石子都没有,先行者必胜,则f[i][0]初始化为1 */ #include<iostream> #include<cstdio> #include<cstring> #define maxn 10010 using namespace std; int f[21][maxn],a[21],n,s; int dfs(int pos,int s){ if(pos>n)pos=1; if(f[pos][s]!=-1)return f[pos][s]; for(int i=1;i<=min(a[pos],s);i++){ int t=s-i; if(!dfs(pos+1,t))return f[pos][s]=1; } return f[pos][s]=0; } int main(){ while(1){ scanf("%d",&n);n*=2; if(n==0)return 0; scanf("%d",&s); for(int i=1;i<=n;i++)scanf("%d",&a[i]); memset(f,-1,sizeof(f)); for(int i=1;i<=n;i++)f[i][0]=1; int ans=dfs(1,s); if(ans)puts("1"); else puts("0"); } return 0; }