本文朋友在上海喝咖啡的时候突然想到的...这段时间就有想写几篇关于碎片问题的笔记,所以回家到以后就奋笔疾书的写出来发表了
2013年5月12日sohu产品技术训练营笔试题填空题有一道题是,一个121砝码磅的砝码跌落在地上碎成5块,每块的分量都是整数,并且可以用这5块来称1至121磅之间的任意整数重物。这5块砝码分量分别是__,__,__,__,__
这是德梅齐里亚克砝码问题。
类似的题目还有:一名商人有一个40磅重的砝码,由于跌落在地而碎成4块,称得每块碎片的分量都是整磅数,而且可以用这4块来称出从1到40磅之间的任意整数磅的重物,请问这4块碎片分别为多重?
这个问题其实挺有意思的。首先我们来参照一下人民币的币值。我们的分币有1,2,5三种币值,两两可以组成1到8之间的多少值,同样,我们在这道砝码问题中第一个要斟酌的因素就是排列组合值。1,2,1+2,5,1+5,2+5,1+2+5。但是我们发明这些值有重合,也就是有冗余。我们要做的就是消除这些冗余。
然而天平称重和人民币组合不同的是,砝码可以放在左右任意一个托盘中,也就是说:排列组合的得出的结果可以取加法,还可以取减法。(事先这一点在考场上就没想到,弄了半天没弄出来,最后就只填了一个1,汗)在上面列出的数字的基础上,我们又失掉了2-1,5-1,5-2,5-1-2(就像买东西找零钱一样)。
当初我们失掉了两个数学概念:排列组合和加减法。
我们将使用这两个概念来解砝码问题。
首先引入两个变量,设当前已知的所有砝码的分量之和为M,我们要选的砝码值是x。
1. 基本单元1是必须的了,所以第一个碎片一定是1磅;
2. 当初M=1,能称1磅的重物;
3. 我们要称的下一个值就是2磅,我们能选的下一个砝码重x磅,这个2磅可以由x+M,x,x-M得来,即x可以选2-M,2,2+M,但我们发明只有选2+M以后的排列组合加减值才不会有冗余,所以x=2+M=(M+1)+M=2M+1=3;
4. 当初M=1+3=4,能称4磅及4磅以下的重物;
5. 下一个要称的值就是5磅,这个5磅可以由x+M,x,x-M得来,即x可以选5-M,5,5+M,其中只有5+M的排列组合没有冗余,而x=5+M=(M+1)+M=2M+1=9;
6. 当初的M值就是13,能称13磅及13磅以下的重物;
7. 这样推下去你就发明了,你要的下一个最优值永远是2M+1,只有这样才不会有过剩的组合加减值。
第四个碎片的值是2M+1=27。而这时四个碎片的总分量是40。
第五个碎片的值是2M+1=81。而这时四个碎片的总分量是121。
我们可以从砝码问题失掉一个德梅齐里亚克数列:1,3,9,27,81,243, ... Xn ...
其中Xn=2M+1.(M=X1+X2+X3+...Xn-1),并且X1,X2,X3....Xn...可以通过加减法表示出1至(X1+X2+X3+...Xn)之间的任意整数。
文章结束给大家分享下程序员的一些笑话语录:
关于编程语言
如果 C++是一把锤子的话,那么编程就会变成大手指头。
如果你找了一百万只猴子来敲打一百万个键盘,那么会有一只猴子会敲出一 段 Java 程序,而其余的只会敲出 Perl 程序。
一阵急促的敲门声,“谁啊!”,过了 5 分钟,门外传来“Java”。
如果说 Java 很不错是因为它可以运行在所有的操作系统上,那么就可以说 肛交很不错,因为其可以使用于所有的性别上。