在Fedora的邮件列表中,见到这样的一个问题:
有2N个人去买票,票价是50,N个人手上有50块钱,
这里的排列数,到底是要输出所有的可能,
还有就是,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 说, 计算机科学首先艺术。