砝码称重

 

2014-6-27flyfish

原题:法国数学家梅齐亚克在他著名的《数字组合游戏》(1962)中提出了一个问题:(The Weight Problem of Bachet de Meziriac)一位商人有一个重40磅的砝码,一天不小心将砝码摔成了4块。后来商人称得每块的重量都是整磅数,而且发现这四块碎片可以在天平上称140磅之间的任意重量。请问这四块碎片各重多少?

 

一个砝码有三种状态,不放在天平上,放在天平左边,放在天平右边

 

当物体放置左边,天平平衡时

物品重量=右边砝码-左边砝码

例如有四个砝码1磅,10磅,100磅,1000磅

天平左边:9磅重的物体+1磅砝码

天平右边:10磅砝码

9磅重的物体=1*(10磅砝码) + (-1)*(1磅砝码) + 0*(100磅砝码) + 0*(1000磅砝码)

 

所以一个砝码有三种状态:

没有放在天平上的砝码状态0,

放在右边砝码状态为1

放在左边为-1

假设4个砝码重量分别是A,B,C,D

这4个正整数分别是多少?

kA+kB+kC+kD=40

k的取值范围是 -1,0,1

 

可以根据排列组合中的乘法原理:做一件事,完成它需要分成n个步骤,做第一步有m1种不同的方法,做第二步有m2不同的方法,……,做第n步有mn不同的方法。那么完成这件事共有 N=m1×m2×m3×…×mn 种不同的方法。

 

那么4个砝码,每个砝码共3种状态,那么共有3^4=81种方法

在组合中有正整数,负整数和0. 去掉0,负数, 因为正整数和负整数对称.结果是(81-1)/2=40

也就是(3^4-1)/2=40.推广到n个砝码就是(3^n-1)/2

 

有了这个式子进行编程。

 

	UINT nSum=40;
	UINT nWeight=0;
	while(nSum>=1)
	{
		nWeight=(nSum*2+1)/3;
		//输出nWeight
		nSum=nSum-nWeight;
	}


结果是27,9,3,1

当nSum换成其他的数是

77(51,17,6,2,1)

88(59,19,7,2,1)

这样还可以出题

出题:一位商人有一个重99磅的砝码,一天不小心将砝码摔成了5块。后来商人称得每块的重量都是整磅数,而且发现这5块碎片可以在天平上称1至99磅之间的任意重量。请问这5块碎片各重多少?

结果是99(66,22,7,3,1)

这个式子并不是唯一解法,有的数字有多种解法。

你可能感兴趣的:(砝码,梅齐亚克,数字组合游戏)