动归解决取球问题 发表于 2017-03-29 | 分类于 algorithm 题目大意 现在有n个小球,每次从盒子中取出的小球数目必须是1, 3, 7, 8个, 不可弃权, 拿到最后一个小球的人为失败 思路 此题可以通过状态转移方程进行计算, 从而避免使用递归的方法, 减少了运算量 当球的数目为0时, 为必胜态, arr[0] = true 只要能转移到必败态的一定是必胜态 无法转移到必胜态的是必败态 代码12345678910111213141516171819202122232425262728293031323334353637#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;}