【算法实验四】--【动态规划】--花生米(二)

1083.花生米(二)

时限:1000ms 内存限制:10000K  总时限:3000ms

描述

五一长假第二天,Tom和Jerry在仓库散步的时候又发现了一堆花生米(这个仓库还真奇怪)。这次Tom制定分花生米规则如下:
       1、Tom和Jerry轮流从堆中取出k粒花生米吃掉,k可以是1,5,10中的任意一个数字;
       2、为显示规则的公平性,Jerry可以选择先取或者后取。
Jerry当然还是希望最后一粒花生米被Tom吃掉。请计算,Jerry为了达到目的应该先取还是后取。

 

输入

本题有多个测例,每个测例的输入是一个整数n,n大于零小于等于1000,代表花生米的数量。
n等于0表示输入结束,不需要处理。

 

输出

每个测例在单独的一行内输出一个整数:Jerry先取输出1;Tom先取输出0。

 

输入样例

1
2
3
4
0

 

输出样例

0
1
0
1

解析:这个题目用动态规划算法求解,说一下思路。每次可以取1,5,10颗花生米,找到的办法应该是无论如何取,轮到Tom取的时候,只剩下一颗,Tom就只能取到这唯一的一颗,因为他不能不取。所以,对于输入的 n 颗花生米,若小于10的时候,只能取1或者5,所以10以内的数量,偶数颗则Jerry先取,因为每个人只能取奇数颗,自己只需要每次取一粒就可以让Tom拿到最后一个,当然10颗也是Jerry先取,因为只要不一下子取10颗,1或者5都是Tom拿到最后。对于超过10颗,如果这次取完(无论1,5,10取几颗)都是Jerry赢,那么就让Tom先取,否则一定要自己先取。所以这里的判断条件应该为

for(int i=11;i<=1000;i++)
{
     if(peanut[i-1]==1&&peanut[i-5]==1&&peanut[i-10]==1)
          peanut[i]=0;
     else 
          peanut[i]=1;
}

这里的意思是,当前状态无论Tom取几颗最后都是Jerry赢,那么我就让Tom先取,否则我就一定要自己先取,因为我可以自己控制自己取的数量,来使得后面Tom取到最后一颗。代码如下:

#include 
#include
using namespace std;
int n;
int peanut[1001];
int take()
{
    for(int i=1;i<=10;i++)
    {
        if(i%2==0)
            peanut[i]=1;
        else
            peanut[i]=0;
    }
    for(int i=11;i<=1000;i++)
    {
         if(peanut[i-1]==1&&peanut[i-5]==1&&peanut[i-10]==1)
              peanut[i]=0;
         else
              peanut[i]=1;
    }
    return 0;
}
int main()
{
    take();
    while(scanf("%d",&n)&&n)
        cout<

 

 

 

你可能感兴趣的:(算法设计与分析)