1000个鸡蛋放到10个箱子里 无论要多少个总能不打开箱子拿出来应该怎样去分据说有13种答案求解啊?
想想一条长度为10的二进制串能表示多少个不同的数吧……
■网友
本题要求为“不可以打开箱子”即只能以整箱为单位做加法。本回答是基于二进制的,二进制的每一位对应一个箱子。选二进制是因为在只能做加法的情况下,二进制编码是一种最有效率的方案。题中一共有10个箱子,理论上可以为1023个鸡蛋编码(1-1023),但是只要求编码到1000,于是就有了多解的可能。选的策略是这样的:先是按照1.2.4.8.16.32.64.128.256.489的顺序排好1.前九位加到一起是511,可以表示1-511的任意数2.加上最后一个数489,这个数组便可以表示1-1000的任意数试想如果最后一个数是512,那么表示范围变成1-1023但是如果把64改成65,那么这个数组无法表示64;如果改成63,则无法表示 127.可以看出,修改数列中最后面的数(第n位数)会修改数列可以表示的范围,而不会出现1-
之间的数无法表示的状况。整个算法就是不停地重复这种“修改最后一位”的操作先试着把第十位加一,变成490,为了保持和不变,还要有一位数减一,减哪一位?蒙一下,第九位减一,变成255(第九位相对于前面八位相当于最后一位)。 没问题吗?验算一下,第1-8位数表示1-255,加上第9位255后可以表示1-510,再加上第10位可以表示1-1000没问题。(可以试试最后两位是257,,488的状况,这样会无法表示256)继续第十位做加法,第九位做减法,直到前九位的和是500,第十位是500,至此得到12个有效解不能再继续了,再继续又会出现无法表示的问题(
=499.501:500无法表示)现在的数列是这样1.2.4.8.16.32.64.128.245.500看前九位:是不是和当初十位的状况一样?1.2.4.8.16.32.64.128都是
,是“满”的,只有最后一位数245"不满"所以可以针对这九位进行相同的操作同理可以对前八位,前七位进行相同的操作直到数列变成这样1.2.4.8.16.31.63.125.250.500整个过程画成图大概是这样
大概如此,没有代码将就着看吧,解肯定不止13个。
■网友
这种题有一个通用解,原理就是基于二进制。有知友已经答过了,我就补充一下具体操作。按照如下规则分组:1、2、4、8……256,即每一箱子内装的数量都是2的整次幂。如果最后一个箱子是512,那么总数1023超出了1000,此时剩多少装多少,即最后一个箱子为489。要从进制的原理说起。所谓十进制,当我们打出12345这一串数的时候,其实代表的是:
同样,二进制下,我们说11010的时候,其实是:
好了,以上是基础知识。让我们从最简单的情况开始,假设我们拥有一组完美的“基数”,十个箱子里分别装有1、2……512个鸡蛋。那么当我们要取任意一个数量的鸡蛋,比如说42,我们把它转化为二进制,是101010。从低位数起,第二、四、六位上的数字是1,则对应地取第二、四、六个箱子,共有 【1000个鸡蛋放到10个箱子里 无论要多少个总能不打开箱子拿出来应该怎样去分据说有13种答案求解啊?】
推荐阅读
- 扔鸡蛋壳等于在扔钱,留在家里特别“值钱”,作用花钱都买不到
- 鸡蛋|这5种食物是血管的“清道夫”,不妨常吃,血管干净不拥堵
- 警惕!它脱落砸死路过男子!鸡蛋大小就可致死!谁担责?有先例!
- 鸡蛋|每天吃1个鸡蛋,得糖尿病的几率提高60%?医生来告诉你答案
- 为啥防范xss要过滤发帖内容,照单全收后显示时直接放到\u003ciframe sandbox security=restrict\u003e中不就行了
- 日产|上世纪90年代的概念车,放到现在依旧很潮,因为种种原因被搁置
- 鸡蛋|医生劝告:不想得癌症的人,最好一辈子都别碰4个“字”,为你好
- 写了一个小程序想放到网页上运行,咋入手
- 在ATM取到假币咋办,银行将钱放到ATM的流程是啥
- FRAPS录制视频的问题
