zoukankan      html  css  js  c++  java
  • 碎片问题德梅齐里亚克砝码问题

    本文朋友在上海喝咖啡的时候突然想到的...这段时间就有想写几篇关于碎片问题的笔记,所以回家到以后就奋笔疾书的写出来发表了

        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 很不错是因为它可以运行在所有的操作系统上,那么就可以说 肛交很不错,因为其可以使用于所有的性别上。

  • 相关阅读:
    Elasticsearch Windows下安装及配置集群
    .Net文件压缩
    DateHelper
    lambda Helper
    Log4net的使用
    python3之rabbitMQ
    python3之协程
    python3之paramiko模块
    python3之redis
    redis
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3074702.html
Copyright © 2011-2022 走看看