/* ios
今盒子里有n个小球,A、B两人轮流从盒中取球,每一个人均可以看到另外一我的取了多少个,也能够看到盒中还剩下多少个,而且两人都很聪明,不会作出错误的判断。 算法
咱们约定:0 编程
*/ spa
//思路以下 code
/* 递归
若是咱们从 10000 个球开始的话,有点困难,咱们不清楚怎么取球能赢,咱们想列举出全部可能状况,但这个几乎不可能。由于状况太多,数量应该是指数级别的。
//----都是假定A先取球,
咱们下降难度,从最简单的子问题开始,咱们设想 :
<1> 当只有 1 个球时,A只有 1 种取法( 1 ) 若是 A 先取球,无论 A 怎么取,A都必输。
==> 记下这个经验 --> 1 个球时,先取必输
<2> 当有 2 个球时, A只有 1 种取法( 1 ), A当前只能取 1 个球,B输了
==> 记下这个经验 --> 2 个球时, 先取必赢
<3> 当有 3 个球时, A有 2 种取法(1,3), A就会想 我若是取 1 个球,此时还剩 2 个球,
那么根据前两次经验中第二个经验,"只有两个球时,先取必赢", 因此我不能取 1 个球,
我若是取 3 个球,那么我又输了。
==> 记下这个经验 --> 3 个球时, 先取必输
<4> 当有 4 个球时, A有 2 种取法(1, 3), 一样A又会想,我若是取 1 个球,此时还剩 3 个球,
那么根据前三次经验中第三个经验, "先取必输",因此我就取 1 个球便可赢得比赛。
==> 记下这个经验 --> 4 个球时, 先取必赢
<5> 当有 5 个球时。。。。。
。
。
。
。
。
<n> 当有 n 个球时 。。。。。
经过不断迭代,获得这个第 n 个球时,就是咱们要求得结果。
这就是动态规划过程,先将大问题划分红子问题,再从子问题开始着手,先解出子问题的解,从子问题解出发,
逐步加大问题,倒着追根溯源,找到咱们要求解的问题为止。
注意:实际上动态规划时都是先能构造原问题与子问题之间的递归方程,按照递归方程列算法 it
*/ io
//代码以下,以模仿动态规划方式解答 class
/* 文件名称: 取球 建立日期: 2013/3/11 */ #include <iostream> #include <vector> #include <algorithm> using namespace std; const a[4] = {1, 3, 7, 8}; bool serach1(vector<bool> v, int n) { int i; for (i = 0; i < 4; i++) { int k = n - a[i]; if (k == 0) return false; if (v[k] == false) return true; } return false; } void show(vector<bool> v) { vector<bool>::iterator it; int k = 0; for (it = v.begin() + 1; it != v.end(); it++) { ++k; cout << k << "\t" << *it << "\n"; } cout << endl; } int main() { vector<bool> v; v.push_back(0);//废除 v.push_back(0);//1 v.push_back(1); v.push_back(0);//3 int i = 0; for (i = 4; i < 100; i++) { v.push_back(serach1(v, i)); } return 0; }