砝码问题
以最简单的方式理解。
砝码问题是巴协(Bachet)给出的:要想在天平上称出1到40磅在内的任何整磅数,问最少需要几个多重的砝码?这里有两种放置砝码的办法:
(1)所有砝码只放进天平的一端
(2)砝码可以放进天平的两端
(以下的所有数均是大于0的整数)
对于(1):所有砝码只放进天平的一端
也就是说,所有的砝码只能通过相加来得到对应的整磅数。因此将问题化为:用最少的几个数仅通过相加,可以得到1~40内的任意整数。
为很好的解决问题,我们再将问题最简化:只用一个数,让它表示1~n以内的任意整数,并且要使n尽可能大。
很明显这个数只能是1,并且n最大也是1。1能表示1~1以内的任意整数(有点拗口,是为了能跟下面的说法格式统一)。
现在将问题升级:只用两个数,让它们仅通过相加来表示1~n以内的任意整数,并且要使n尽可能大。
用[1,max]来表示1~max以内的任意整数,最大为max。则一个数时为[1,1]。
添加第二个数时,1是不能少的,因为只有1可以表示1。假设第二个数为k,则表示的范围变为:
[1,1]U[k,k]U[1+k,1+k] 可以化简为:[1,1]U[k,1+k],最大为1+k,要想让表示的范围连续,则要满足1>=k-1。
举个例子 [1,5]U[7,10],因为5<7-1,所以是没法构成[1,10]的。为什么1>=k-1中,k<=2可以取2呢?
这是因为[1,max]表示的是整数集,k为2也是可以构成连续的。所以为了使1+k最大,则k取最大值为2。
也就是(1,2)仅通过相加能表示1~3以内的任意整数。
在这里我们可以得到,当前的连续范围是[1,max],为使[1,max]U[k,k+max]连续,下一个数k的取值范围是k<=max+1。
因此,为使得到的范围是最大的,这里k的取值永远是k = max + 1。
现在再将问题升级:只用三个数,让它们仅通过相加来表示1~n以内的任意整数,并且要使n尽可能大。
第3个数必须依赖于前面两个数(1,2),没有1和2其中一个,都不能表示1~n以内的任意整数。
(1,2)表示的范围是[1,3],max=3,因此第3个数k=3+1=4。因此三个数(1,2,4)能表示1~7以内的任意整数。
此时max=7,下一个数k=max+1=7+1=8=2^3,并且我们发现前面三个数也都是2的幂。
k的取值是max+1,max的值是2^0+2^1+2^2+2^3+......+2^(n-1)=2^n-1。可以得到:k=2^n,其中k为第n+1个数。
结论:假设有a个数,则它们能表示的[1,max]中,max=2^a - 1,第n个数为2^(n-1)。
我们回到最初的问题:要想在天平上称出1到40磅在内的任何整磅数,问最少需要几个多重的砝码?放置砝码的方式是所有砝码只放进天平的一端。
根据上面的结论:40应该小于或等于max,即40<=max。代入公示得:2^a - 1>=40。a为整数,则解得a最小为6.
因此,最小需要6个砝码,这6个砝码分别是:1,2,4,8,16,32。
对于(2):砝码可以放进天平的两端
规定物品是放在天平的右边,如果砝码放在天平的右边,我们表示为负,相当于减,放在左边为正,相当于加。
跟(1)的区别就是,这几个数(砝码)不仅可以加,还可以减。问题化为:用最少的几个数通过相加或相减,可以得到1~40内的任意整数。
还是从最简单的问题开始分析:只用一个数,让它表示1~n以内的任意整数,并且要使n尽可能大。
这个数只能是1。
升级:只用两个数,让它们通过相加减来表示1~n以内的任意整数,并且要使n尽可能大。
这次先通过枚举分析:
(1,2):最大能表示3
(1,3):最大能表示4
(1,4):最大能表示5,但不能表示2(没法得到)
(2,3):最大能表示5,但不能表示4(没法得到)
.....
因此这两个数是(1,3):(1,3)可以通过相加减来表示1~4以内的任意整数。
发现两个数中1也出现了,是不是跟上面一样,两个数的时候需要依赖于前面一个数,三个数的时候需要依赖于前面两个?
答案是:是的。3是怎么来的呢?其实跟上面用同样的方法可以推导出来:
当只有一个数时,所能表示的范围是[1,1]。假设第二个数为k,[1,max]中,添加的数k肯定是大于max的
则范围变为:[1,1]U[k-1,k-1]U[k,k]U[1+k,1+k] 化简为:[1,1]U[k-1,k+1]。
这里k-1是因为砝码与砝码之间可以相减,因为k大于max,因此k-max大于0。
同样的问题:要想[1,1]U[k-1,k+1]连续,则1>=(k-1)-1,得到k<=2*1+1,这里取最大值k为3。
( [1,max]U[k-max,k-1]U[k,k]U[k+1,k+max] 化简为:[1,max]U[k-max,k+max] )
因此也可以推导出:当前的连续范围是[1,max],为使[1,max]U[k-max,k+max] 连续,下一个数k的取值范围是k<=2*max+1。
为使得到的范围是最大的,这里k的取值永远是k = 2*max + 1。
升级:只用三个数,让它们通过相加减来表示1~n以内的任意整数,并且要使n尽可能大。
两个数时max为4,则第三个数为2*4+1=9。所以(1,3,9)能表示1~13以内的任意整数。
发现了吗,它们是3的幂。当k为第n+1个数时,k=3^n。
结论:假设有a个数,则它们能表示的[1,max]中,max=((3^a) - 1)/2,第n个数为3^(n-1)。
我们回到最初的问题:要想在天平上称出1到40磅在内的任何整磅数,问最少需要几个多重的砝码?放置砝码的方式是砝码可以放进天平的两端。
根据上面的结论:40应该小于或等于max,即40<=max。代入公示得:((3^a) - 1)/2>=40。a为整数,则解得a最小为4.
因此,最小需要4个砝码,这4个砝码分别是:1,3,9,27。
对于(1),砝码具有两种状态,不放或者放。记不放为0,放为1,这个问题可以使用二进制来解决。二进制的砝码重量设置为1、2、4、8、16、32。在1到1+2+4+8+16+32也就是63之内的任何数量都可以用1、2、4、8、16、32中的某几个数相加得到。所以问题(1)的砝码数是6个,每个砝码的重量设置为1、2、4、8、16、32磅。
对于(2),砝码具有三种状态,不放、放在天平左端、放在天平右端。记不放为0,放左边为1,放右边为-1,这个问题可以使用三进制来解决。在三进制中,砝码的重量设置为1、3、9、27.。在1到1+3+9+27也就是40之内的任何数量都可以用1、3、9、27中的某几个数相加或者相减获得。