德·梅齐里亚克的法码问题The Weight Problem of Bachet de Meziriac
一位商人有一个40磅的砝码,由于跌落在地而碎成4块.后来,称得每块碎片的重量都是整磅数,而且可以用这4块来称从1至40磅之间的任意整数磅的重物.
一位商人有一个40磅的砝码,由于跌落在地而碎成4块.后来,称得每块碎片的重量都是整磅数,而且可以用这4块来称从1至40磅之间的任意整数磅的重物.
问这4块砝码碎片各重多少?
这是一个著名的初等数学问题,解决这样的问题我们第一想到的办法就是穷举法。
假设: 4个碎片的重量分别为整数a,b,c,d,那么从1到40中的任意整数n都必然能被a,b,c,d的加减组合所表示。我们直观的想到将a,b,c,d的所有加减组合全部列出来:
一个操作数:a?n b?n c?n d?n
两个操作数:a+b?n a+c?n a+d?n b+c?n b+d?n c+d?n b-a?n c-a?n c-b?n .....
三个操作数:.....
很快我们就发现太复杂了,能不能有一种比较简单的方式将可能的计算组合全部表示出来呢?
我们想到,对于a,b,c,d四个数来说,参加计算的数是从其中任选出来的,我们可以用4bit的0、1字符串来记录对应的数是否参与计算,1表示参与,0表示不参与。
如0001表示只有a参与计算
这样对应的计算组合就有
dcba
0001
0010
...
1111
二进制转化为10进制,一个循环就可以搞定。
同理,由于计算只能为加减运算,且参与计算的数最多只有4个,则参与计算的操作符最多为3个,用和上述类似的方法将操作符的组合穷举出来。
代码:
public class T002 {
/**
* @author magic_wk
*/