砝码称重
来源:互联网 发布:织梦cms用户名不存在 编辑:程序博客网 时间:2024/04/28 15:27
2014-6-27flyfish
原题:法国数学家梅齐亚克在他著名的《数字组合游戏》(1962)中提出了一个问题:(The Weight Problem of Bachet de Meziriac)一位商人有一个重40磅的砝码,一天不小心将砝码摔成了4块。后来商人称得每块的重量都是整磅数,而且发现这四块碎片可以在天平上称1至40磅之间的任意重量。请问这四块碎片各重多少?
一个砝码有三种状态,不放在天平上,放在天平左边,放在天平右边
当物体放置左边,天平平衡时
物品重量=右边砝码-左边砝码
例如有四个砝码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;//输出nWeightnSum=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)
这个式子并不是唯一解法,有的数字有多种解法。
- 砝码称重
- 砝码称重
- 砝码称重
- 砝码称重
- 砝码称重
- 砝码称重
- 砝码称重
- 砝码称重
- 砝码称重
- 砝码称重
- 砝码称重
- 砝码称重
- 砝码称重
- 砝码称重
- 砝码称重
- 砝码称重
- 砝码称重
- 砝码称重
- How Tomcat works 之第十二章之重新载入支持
- C/C++对Unicode编码的处理
- C#数据类型
- 国外程序员推荐:每个程序员都应该读的非编程书
- 【OJ】---U---矩阵求和--重载运算符
- 砝码称重
- poj 1700 Crossing River(贪心)
- 搜索第一篇(迷宫)
- 重载与覆盖的区别
- Using "return false;" in onclick Event in JavaScript
- 创建和关联内容数据库到指定Web应用程序和网站集
- 基于linux下的dm9000网卡移植全分析
- UIMA 的CAS和Annotation
- △(程序不理解)【OJ】---V---复数类,重载运算符3+