【NOJ1083】【演算法實驗四】【DP_動態規劃】花生米(二)
阿新 • • 發佈:2018-11-12
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]; }