首页 > 试题广场 >

购票采用什么算法来解决?

[单选题]
绘画展览门票每张5元,如果有2n个人排队购票,每人一张,并且其中一半人恰有5元钱,另一半人恰有10元钱,而票房无零钱 可找,那么如何将这2n个人排成一列,顺次购票,使得不至于因票房无零钱可找而耽误时间,应该采用什么算法解决呢?()
  • 贪心算法
  • 分支限界法
  • 回溯法
  • 动态规划法
关于五大常用算法,来自随遇而安随缘一世的http://blog.csdn.net/lcj_cjfykx/article/details/41691787,值得大概了解。
贪心算法:在对问题求解时,总是做出在当前看来是最好的选择,有可能陷入局部最优。
分治:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
动态规划:将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。与分治的区别:经分解后得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)。
回溯:在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。
分支限界:采用广度优先的策略,在问题的解空间树T上搜索问题解。与回溯区别:回溯法的求解目标是找出T中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。
//////////////////////////////////////////////////////////////////////
至于题目,题意为排队购票,大的调整肯定不行,否则我直接喊所有5块的站前边,10块的站后边,排队的人肯定不乐意。
所以,必须依着本来的排队顺序,一步一步走,即从根结点出发,一步一步判断。就是分支限界的FIFO搜索:将活节点表组织成一个 队列,并将队列的先进先出原则,选取下一个节点为当前扩展节点。(其实都不知道自己在说什么)
编辑于 2015-09-21 09:13:39 回复(7)
这个是卡特兰数的经典应用。但是这个问题不是一两句话能说得清的,介绍卡特兰数的文章都用大量的篇幅讲他的原理。这里给你一个类似问题的描述,看看能不能看懂。
问题描述: 
12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种? 
这个笔试题,很YD,因为把某个递推关系隐藏得很深。 
问题分析: 
我们先把这12个人从低到高排列,然后,选择6个人排在第一排,那么剩下的6个肯定是在第二排. 
用0表示对应的人在第一排,用1表示对应的人在第二排,那么含有6个0,6个1的序列,就对应一种方案. 
比如000000111111就对应着 
第一排:0 1 2 3 4 5 
第二排:6 7 8 9 10 11 
010101010101就对应着 
第一排:0 2 4 6 8 10 
第二排:1 3 5 7 9 11 
问题转换为,这样的满足条件的01序列有多少个。 
观察1的出现,我们考虑这一个出现能不能放在第二排,显然,在这个1之前出现的那些0,1对应的人 
要么是在这个1左边,要么是在这个1前面。而肯定要有一个0的,在这个1前面,统计在这个1之前的0和1的个数。 
也就是要求,0的个数大于1的个数。 
OK,问题已经解决。 
如果把0看成入栈操作,1看成出栈操作,就是说给定6个元素,合法的入栈出栈序列有多少个。 
这就是catalan数,这里只是用于栈,等价地描述还有,二叉树的枚举、多边形分成三角形的个数、圆括弧插入公式中的方法数,其通项是c(2n, n)/(n+1)。 
在<<计算机程序设计艺术>>,第三版,Donald E.Knuth著,苏运霖译,第一卷,508页,给出了证明: 
问题大意是用S表示入栈,X表示出栈,那么合法的序列有多少个(S的个数为n) 
显然有c(2n, n)个含S,X各n个的序列,剩下的是计算不允许的序列数(它包含正确个数的S和X,但是违背其它条件)。 
在任何不允许的序列中,定出使得X的个数超过S的个数的第一个X的位置。然后在导致并包括这个X的部分序列中,以S代替所有的X并以X代表所有的S。结果是一个有(n+1)个S和(n-1)个X的序列。反过来,对一垢一种类型的每个序列,我们都能逆转这个过程,而且找出导致它的前一种类型的不允许序列。例如XXSXSSSXXSSS必然来自SSXSXXXXXSSS。这个对应说明,不允许的序列的个数是c(2n, n-1),因此an = c(2n, n) - c(2n, n-1)。 

分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。
在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。

此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。
然后回到本问题,排队买票的每个人都是不同的,n个人有5元,n个人有10美分,最后结果在乘以A(n,n)*A(n,n),即为“[c(2n, n) - c(2n, n-1)]*A(n,n)*A(n,n)”
如果是填空题填多少种方法就是   (2n)!/[n!(n+1)!]
发表于 2016-02-07 16:38:20 回复(0)
题目的意思是只要求得一个可行解就行了,那不就是贪心么,5元钱的全排前面
发表于 2015-09-19 21:31:05 回复(3)
题目对应的模型是卡特兰数的典型应用。
发表于 2016-03-22 13:54:51 回复(0)
大佬,为什么不是“动态规划法”呢
发表于 2021-09-20 20:12:48 回复(0)
这题难道不是动态规划?卡塔兰数的递推式就是状态转移方程。当然某种意义上基本上所有的DP问题都可以用搜索去做。
发表于 2018-07-09 23:11:40 回复(0)
题目只要求求一可行解啊,贪心构造不可以吗?
发表于 2016-08-10 20:09:13 回复(0)
贪心算法:在对问题求解时,总是做出在当前看来是最好的选择,有可能陷入局部最优。
分治:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
动态规划:将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。与分治的区别:经分解后得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)。
回溯:在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。
分支限界:采用广度优先的策略,在问题的解空间树T上搜索问题解。与回溯区别:回溯法的求解目标是找出T中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。
发表于 2016-06-20 15:59:32 回复(0)
贪心算法:在对问题求解时,总是做出在当前看来是最好的选择,有可能陷入局部最优。
分治:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
动态规划:将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。与分治的区别:经分解后得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)。
回溯:在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。
分支限界:采用广度优先的策略,在问题的解空间树T上搜索问题解。与回溯区别:回溯法的求解目标是找出T中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。
发表于 2016-05-29 09:31:43 回复(0)
画个nn的矩阵 5则横着走 10竖着走 左下角的全部路线就是结果
发表于 2016-03-21 23:39:43 回复(0)
贪心算法不能保证最优解。。。
发表于 2015-09-25 17:29:07 回复(0)
本人选的是贪心算法,感觉贪心算法很容易就能找到一个较好的解。
发表于 2015-09-25 09:26:21 回复(0)
我也觉的是A,问题是应该采用什么算法解决呢? 那么如何将这2n个人排成一列!他问你如何进行排列。那我就贪心排列好啦!这么理解没有错吧。 分支限界1L也说了是搜索问题解。也有可能无解吧?并没有解决方案啊,他能进行判断,不能解决方案。抱歉,我的理解是这样的。不知道对不对。
发表于 2015-09-21 20:36:15 回复(0)