[1000个苹果分10箱]一道李开复面试题目的证明

【题目】

1000个苹果放入10个箱子。客户如果要获得1~1000个苹果中的任意个数,都可以整箱搬,而不用拆开箱子。问是否有这样的装箱方法?

 

【问题背景】

这是从《对话》节目中 李开复 博士现场面试清 华 博士生时提到的一个问题。题目结构及意思比较简单明确,可求解过程似乎并不那么容易。虽然节目中有提示,但直到节目看完,还是一头雾水。下面给出我自己的想法及解题思路,希望与有兴趣的朋友一起讨论。

 

【答案】

节目现场给出了一些提示,并没有公布正确答案,按照节目中的提示,应该存在这样的装箱方法,结果是:

 1248163264128256489

 

【数值试验】

先对9~17做数值试验。

91+8          102+8                  111+2+8

124+8         131+4+8               142+4+8

151+2+4+8   1616                    1716+1

 

【程序穷举】

    //定义结果

private static int[] vars = {1, 2, 4, 8, 16, 32, 64, 128, 256, 489};

//记录不重复使用标识

private static boolean[] has = new Boolean[vars.length];

//任给value检验是否可以按结果拆分

    private static boolean isSum(int value) {

        boolean result = false;

        int len = vars.length;

        for (int i = 0; i < len; i++) {

            has[i] = true;

        }

 

        for (int i = len - 1; i >= 0; i--) {

            if (value >= vars[i] && has[i]) {

                value -= vars[i];

                has[i] = false;

                if (value == 0)

                    return true;

            }

        }

 

        return false;

    }

      //主函数调试

    public static void main(String[] args) {

        for (int i = 1; i <= 1000; i++)

              System.out.println(i+”  ”+ isSum(i));

    }

 

【论证思路】

(正向思路)任给小于1000的整数可以表示成以2为公比的等比数列{2**n}中某些个数的集合,且集合中没有重复数值。

(反向思路)

[1]2为公比的等比数列{2**n}任意提取k个值求和结果不同;

[2]2为公比的等比数列{2**n}任意提取k个值所有求和可以获得2**(n+1)-1个结果。

 

【证明过程】

下面以反向思路证明。

已知以2为公比的等比数列:124816...

首先将前n项相加,得到和为:2**n-1

n项与第1项相加得到和为:2**(n-1)+1

因此任取k个数相加的和属于(2**(n-1),2**n,且和不重复。

至此证明了[1]

数列前n项任取k个求和构成的和的总个数为

S = C(n1)+C(n2+C(n3+...+C(n,k)+...+C(nn

 

泰勒级数展开式为

f=f0+f1*x**1/(1!)+f2*x**2/(2!)+...+fn*x**n/(n!)+...

构造函数f=x**n

采用泰勒级数在x=1处展开,其中fx=1处的n阶导数为:

f0=x**n=1

f1=nx**(n-1)=n

f2=n(n-1)x**(n-2)=n(n-1)

fn=n!x**0=n!

f(n+1)=0

y=x-1由此

f=x**n=1+n*y+n(n-1)*y**2/2!+...+n!*y**n/n!

=1+C(n,1)y+C(n,2)*y**2+...+C(n,k)y**k+...+C(n,n)*y**n

x=2

2**n=1+C(n,1)+C(n,2)+...+C(n,k)+...+C(n,n)=S+1

因此

S=2**n-1

即前n项数列任取k个求和构成的和的个数为2**n-1

至此证明了[2]

而数列第n+1项为2**n

至此命题得证。

 

【扩展】

因为1000<1024,应该有其它方法。

刚查了一下,找到了另一种解法:{5002501256331168421}

但是对于等比数列似乎只有以2为公比的等比数列才满足要求。

是否还有其它的论证过程呢?节目中李开复一直说二进制,是否可以用二进制计数法证明?

 

【结论】

证明过程是否严谨,还有待考究。

但是可以肯定结果{1248163264128256489}是满足要求的,通过测试程序的输出结果说明了这点。

 

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值