Zhao70's Blog

动归解决取球问题

题目大意

现在有n个小球,每次从盒子中取出的小球数目必须是1, 3, 7, 8个, 不可弃权, 拿到最后一个小球的人为失败

思路

  1. 此题可以通过状态转移方程进行计算, 从而避免使用递归的方法, 减少了运算量
  2. 当球的数目为0时, 为必胜态, arr[0] = true
  3. 只要能转移到必败态的一定是必胜态
  4. 无法转移到必胜态的是必败态

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
using namespace std;
bool arr[10500];
int query[150];
int main(int argc, char const *argv[])
{
arr[0] = true;
int prob[4] = {1, 3, 7, 8};
for(int i = 1; i <= 9999; i++)
{
for(int j = 0; j <= 3; j++)
{
if(i - prob[j] < 0)
continue;
if(arr[i - prob[j]] == false)
{
arr[i] = true;
break;
}
if(j == 3)
{
arr[i] = false;
}
}
}
// for(int i = 0; i <= 100; i++)
// cout << arr[i] << " ";
int nQuery;
cin >> nQuery;
for(int i = 0; i < nQuery; i++)
{
int val;
cin >> val;
cout << arr[val] << endl;
}
return 0;
}