巴协(Bachet)砝码问题:利用三进制或二进制

砝码问题

以最简单的方式理解。

砝码问题是巴协(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中的某几个数相加或者相减获得。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值