organic

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

一、一个经典的问题:
你让工人为你工作 7 天,给工人的回报是一根金条。金条平分成相连的 7 段,你必须在每天结束时给他们一段金条,如果只许你两次把金条弄断,你如何给你的工人付费?

二、思路:
1. 金条是可以找钱的,如工人有一段金条,付当天工钱时可以用2段去换工人的一段,不能说工人拿到金条了马上拿去花了,那就没得玩了
2. 金条只允许弄断2次,也就是说最后只有3段金条
3. 因为工人每天拿到的工钱是递增的,也就是说工人会依次拿到 1, 2, 3 ... 7段金条
4. 因此,这个问题可以转化为:如何用3个数进行组合后,可以得到 1, 2, 3 ... 7,而且这3个数其中的任何一个在某一天可能在我这里,也可能在工人哪里,如果我们用1表示某个数在我这里,用0表示不在我这里,根据数理逻辑,这刚好就是一个二进制数表达的问题:
这3个数就是:
1 1 1
我们发现3位的二进制可以表达的数字是 0 ~ 111,也就是0 ~ 7,刚好满足题目的要求,那么接下去就简单了,3位二进制的每一个位即表示一段金条的长度,该位为1,表示此段金条在我这里,为0表示则付给工人了。
那3位对应的二进制数就是:1, 2, 4
支付方法刚好就是一个真值表:
第一天:110, 给工人1段的金条
第二天:101, 给工人2段的金条,拿回1段金条
第三天:100, 1段和2段的金条都给工人
第四天:011, 给工人4段的金条,拿回1段和2段的金条
第五天:010, 再给工人1段的金条
第六天:001, 给工人2段的金条,拿回1段金条
第七天:000, 金条就都给工人了

三、扩展
弄清楚这个问题的本质后,我们再往前扩展一下,如增加一个位,就会变成1111,可以表达0~15,那么题目同样可以换为一个工人为你工作15天,金条只能分4段,问该怎么分?如果看清楚了上面的思路的朋友,我相信应该很快就能解答出来。

posted on 2016-07-20 22:11  organic  阅读(1412)  评论(0编辑  收藏  举报