1. 使用動態規劃陣列 bb[1000000],先設 bb[0] 為 1 ,其他為 -1 ( 表示尚未判斷 )。 bb[i]表示當有 i 個箱子時的勝負,1 表後手( Kitty )勝,0 表先手( OpenChan )勝。
2. 把第二排的整數( 一次拿的數量 ) 用 aa 陣列存並排序。
3. 先把所有的 bb[ aa[i] ] ( 0<= i <= n-1 ) 設為 0 ( 當箱子數量恰等於一次可拿的數量時,則先手方可以一次拿完,先手勝。 )
4.之後依序判斷 bb[1]~bb[1000000] :
4-1.當 bb [ i ] = -1 時,表示尚未判斷過,應執行判斷 。
4-2.先假設當前數量為後手勝,之後判斷小於等於 i 的 aa[ j ] ( 0<= j <= n-1 ) && ( i >= aa[ j ] ) 。
4-3. 若有任何 aa[ j ] 使得 bb[i-aa[j]] = 1 ,則結束判斷。表示 OpenChan 拿 aa[ j ] 個箱子換 Kitty 拿的時候可形成後手勝 ( 對 Kitty 不利的局面 ) ,則當前狀況為 OpenChan ( 先手方 ) 可勝。 設 bb[ i ] = 0。
4-4. 若沒有 , 則 OpenChan 不管拿多少箱子都無法形成後手勝 ( 對 Kitty 不利的局面 ) ,因此當前狀況為 Kitty ( 後手方 ) 可勝。 設 bb[ i ] = 1。
5 . 之後對每筆詢問 ai 檢查 bb[ ai ] 。若為 0 ,則輸出 OpenChan ,反之輸出 Kitty 。