大家都去读编程珠玑吧。。。(首先声明我看不懂,目前的)
当然算法在一些情况下是重要的,比如珠玑的第一个案例就很实际,还有物理学之类的,图像处理之类的,效率至上。
像出这种题难住可爱的程序员的,可以去屎了。
On Sat, 14 May 2011 20:24:40 +0800 microcai <microcai(a)fedoraproject.org> wrote:
于 2011年05月14日 17:08, 宏羽杜 写道:
>
有2N个人去买票,票价是50,N个人手上有50块钱,N个人有100块钱,售票员手上没有零钱.问这2N个人有多少种排队方法.当输入一个N时,输出排列数.N<=20.
>
> 但是我不理解的是这里的排列数,到底是要输出所有的可能,还是要把每一个可能都输出呢?
> 还有就是,100的N个人和50的N个人之间是不是有差别的(即,是不是需要组合.)
>
为何很多人宣称学不好数学就当不好程序员呢?
因为他们狭隘的认为程序==算法
而他们又狭隘的认为算法==数学。
只因为他们遇到的算法题目都是数学题。
实际上呢?
实际上上,数学题(如果非要用计算机去解决的话)通常都是由专业的数学软件去解
决的 ....
而软件工程,则事实上不需要多少数学知识,他更多的是需要广阔的知识面,对各
种实际软件硬件的深刻理解。
拿数学题目去当习题练习编程,本身就是错误的。
好了,批判完这个,我开始解决你手头的数学题好了。
其实方法很简单,就是保证售票员手里总是有余钱就可以了。
只要手里拿 50票子的人总是在拿100票子的人之前付款,这样的排队方式就是可以的。
首先我们把这类人排两队。 那么每一个队伍的排队方法是 A(N)(N) 种。
那么,典型的就是 N 个 50票子的人和 N 个 100 票子的人交错排队,保证拿 50
的在前就可以了
那么可能的情况就是 A(N)(N) * A(N)(N) . 分别是 两队 N 个人员的完全排列
再对这2个完全排列的进行组合。
但是,这还只是其中的一种情况。
事实上, 这2队人可以任意穿插,只要在穿插的时候,保证 50 票子那队的人先行
排队。
这样算出来排列的可能性就可以用一个公式表达出来了。 诶,好几年没学数学
了,都不知道接下来怎么排了。囧,请知道的人赶紧站出来指点一下。
反正,只要一个公式折腾出来就可以了,程序也就是一个简单的计算过程,
按按计算器就可以了。
= =
我说到,公式出来了,按按计算器就可以了,我是这么说的么? 呵呵。
所以啊,解决数学问题不是程序员的事情,编写好用的计算器软件才是。
国内的教育都在误导程序员去做数学家。
而编写计算器软件,则更多的是艺术~~~~~~ 而不是数学。
so, knuth 说, 计算机科学首先艺术。
--------------------
Mike is here.
My OS: Fedora x64
My blog:
www.ekd123.org [Powered by Chito]
My favorite editor: Emacs 23.2
My E-mail client: Mew 6.3 on Emacs 23.2.
--------------------