类似于花生米(三)的取石子问题

//题目:有n个石子 两个人交替取石子 第一次取一个 以后每一次取的石子不超过前一个的二倍 先去完的胜利 
#include<iostream>
using namespace std;
int main()
{
int l[100][100];//l[i][j]表示剩余n个石子 这一次最多取j个   因为是最多取j个 所以要用k列举1~j的所有情况  
int i,j,k,flag,n;
cin>>n;
l[1][1]=1;
for(i=2;i<=n;i++)
{
for(j=1;j<i;j++)//j一定要小于i 因为j>=i的话一次就ok了 没有意义了 
{ //计算l[i][j] 
flag=0;//先立个flag  如果找到了上一步为0 flag变成1 否则flag还是0 
for(k=1;k<=j;k++)//开始列举l[i][1~j]的所有情况 
{
  if(2*k>=i-k)//如果我取了之后对方  一次没错一次就取完了 涉及到的是没有计算的l[i][j] 那么我就失败了 
  {
  break;
  }
  if(l[i-k][2*k]==0)//如果找到了上一步为0的情况那么我就胜利了
  //很多人包括我会疑惑为什么一步就判断出来了 也就是为什么[2*k]会这么神奇 没错它就是这么神奇 
  //因为对方足够聪明 如果最大的k还不能取到1  那么他就失败了 
  //按照该算法 每次都会列举一下  尽可能的使flag=1 
  {
  flag=1;
  break;
  }
}
l[i][j]=flag;
}
}
cout<<l[n][1]<<endl;
return 23;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值