1. 程式人生 > >【NOJ1083】【演算法實驗四】【DP_動態規劃】花生米(二)

【NOJ1083】【演算法實驗四】【DP_動態規劃】花生米(二)

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。


#include <iostream>

using namespace std;

int n;

int isWin[1000];

int dp(int x);

int main()
{
    while(cin>>n&&n)
    {
        cout<<dp(n)<<endl;
    }
    return 0;
}

int dp(int x)
{
    isWin[1]=0;    //只有1顆時先取必輸,後取必贏
    for(int i=2; i<=x; i++)    //i-1,i-5,i-10中有一個以上為0(先取必輸),都可讓剩i顆時必贏
    {
        isWin[i]=isWin[i-1];
        if(i>5)

        {
            isWin[i]*=isWin[i-5];  
        }
        if(i>10)
        {
            isWin[i]*=isWin[i-10];
        }
        isWin[i]=1-isWin[i]; 
    }
    return isWin[x];
}