砝码称重问题,因式分解有妙用

如果天平两端都允许放砝码,并且假定所有的砝码都是整数克。为了称出从 1 克到 40 克 所有整数克 的物品,最少需要几个砝码?

感兴趣的读者不妨自己先试着想想,再往下看。

秘密在于 3 的幂

说起来这个问题历史还算是挺悠久的。据《数学游戏与欣赏》( [英] 劳斯·鲍尔 [加] 考克斯特 著,杨应辰等 译),这个问题被称作巴协 (Bachet) 砝码问题;而据《数学聊斋》(王树禾著),该问题至少可追溯到 17 世纪法国梅齐里亚克 (Meziriac, 1624) 。他们给出的答案是:

最少需要 4 个砝码,规格分别为 1 克、3 克、9 克和 27 克。

例如,为了称出 2 克的物品,我们只需在天平一端放 3 克砝码,在另一端放上 1 克的砝码;而要称出 7 克的物品,则可以在一端放上 1 克和 9 克的砝码,另一端放上 3 克的砝码。

类似地,要称出 1 克到 4 克中所有整数克的物品,只需要 2 个砝码;要称出 1 克到 13 克中所有整数克的物品,则只需要 3 个砝码;要称出 1 克到 121 克中所有整数克的物品则要 5 个砝码,它们分别是 1 克、3 克、9 克、27 克和 81 克,如此等等。

也许有人已经心领神会了,但是如果就此满足而匆匆离去的话,可能就错失了一个领略数学思想的机会——问题到这里并未结束啊!例如,4 个砝码究竟是不是最少的?还有没有其他的组合?对这些疑问的一个彻底的分析和说明,是 19 世纪由麦克马洪 (MacMahon) 给出的。下面就来领略一下其中的思想吧,或许你会从中学到很多。

因式分解的妙用

假设有一个重为 a 克的砝码,那么用它自然能够称出 0 克和 a 克的物品。不过,如果虚设天平的某一端为正的话,利用此天平和砝码我们还能称出 - a 克的物品——不妨规定把 a 克砝码放在天平右侧,将物品放在天平左侧,由此可以称出 a 克的物品;但若把 a 克砝码放在天平左侧,把物品放在天平右侧,由此称出的物品重量记作 - a。目前这样一种设想有点怪异,但这实际上和人类引入负数的思想是相同的。很快大家便会发现,这种设定非常精妙地简化了我们的计算和推导。现在暂且把该砝码能够称出的重量 - a,0,a 放进一个表达式中:

现在,假设有两个不同规格的砝码,分别重 a 克和 b 克(a

可以看到,它不是别的,正好是

的展开式。

另外,假设有 m 个同样重为 a 克的砝码,则可以称出 - ma,- (m - 1)a,…,0,…,(m - 1)a,ma 克的物品。暂且按照上面的办法,把这些数也塞进一个表达式中 :

结合上面的分析,容易看出,如果有 m 个 a 克的砝码,n 个 b 克的砝码,等等,那么可以称出物品的克数就是表达式

展开后出现过的那些 x 的幂数,而展开式中 x 的 i 次项系数就表示用给定的这组砝码称出 i 克物品的不同方法数。

如果要称出 1 到 40 中所有的整克数,并且要求所用的砝码尽可能少,我们自然希望这些砝码能够“物尽其用”,称出的克数正好都是我们需要的克数,并且称的方法都是唯一的。也就是说,上述表达式展开后应该恰好是

反过来,就是要把

还原成

的形式。

对这个式子进行分解,一共有八种不同的方案:

前四个式子展示了我们实际上是如何对原式进行逐步分解的。它们的意义依次为:(1) 40 个 1 克的砝码;(2) 1 个 1 克,13 个 3 克的砝码 ;(3) 1 个 1 克,1 个 3 克以及 4 个 9 克的砝码;(4) 1 个 1 克,1 个 3 克,1 个 9 克以及 1 个 27 克的砝码。其中,第四个分解式是最基本的,它就是我们想要的答案。

当然我们还要说明,除了上面列举的 8 种组合之外没有其他的组合。这是一个多少有些复杂的讨论,不过我们可以就此为止了,因为上面的分解式看起来应该明显包含了所有可能的分解。最少的那组已经明摆着了,无须再说。大家可以到 死理性派小组 参与更详细的讨论

http://www.guokr.com/article/3742/

时间: 2024-12-18 13:20:56

砝码称重问题,因式分解有妙用的相关文章

1449 砝码称重

1449 砝码称重 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 现在有好多种砝码,他们的重量是 w0,w1,w2,...  每种各一个.问用这些砝码能不能表示一个重量为m的东西. 样例解释:可以将重物和3放到一个托盘中,9和1放到另外一个托盘中. Input 单组测试数据. 第一行有两个整数w,m (2 ≤ w ≤ 10^9, 1 ≤ m ≤ 10^9). Output 如果能,输出YES,否则输出NO. Input示例

2144 砝码称重 2

2144 砝码称重 2 http://codevs.cn/problem/2144/ 题目描述 Description 有n个砝码,现在要称一个质量为m的物体,请问最少需要挑出几个砝码来称? 注意一个砝码最多只能挑一次 输入描述 Input Description 第一行两个整数n和m,接下来n行每行一个整数表示每个砝码的重量. 输出描述 Output Description 输出选择的砝码的总数k,你的程序必须使得k尽量的小. 样例输入 Sample Input 3 10591 样例输出 Sa

【dp】砝码称重

砝码称重 来源:NOIP1996(提高组)  第四题 [问题描述]     设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000),用他们能称出的重量的种类数. [输入文件]   a1  a2  a3  a4  a5  a6     (表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个,中间有空格). [输出文件]   Total=N     (N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况). [输入样例]     1 1 0 0 0

HFUT 1354.砝码称重(安徽省2016“京胜杯”程序设计大赛 A)

砝码称重 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 12 Accepted: 10 Description 小明非常喜爱物理,有一天,他对物理实验室中常用的弹簧拉力计产生了兴趣.实验室中有两种质量不同的砝码,小明分别用a个第一种砝码放在弹簧拉力计上和b个第二种砝码放在弹簧拉力计上,假设每增加单位重量的砝码,弹簧拉力计的长度增加1,那么两次称量弹簧拉力计的长度差是多少呢?(假设拉力计不发生非弹性形变) Input 第

砝码称重问题二

题目描述 有一组砝码,重量互不相等,分别为m1.m2.m3……mn:它们可取的最大数量分别为x1.x2.x3……xn. 现要用这些砝码去称物体的重量,问能称出多少种不同的重量. 现在给你两个正整数列表w和n, 列表w中的第i个元素w[i]表示第i个砝码的重量,列表n的第i个元素n[i]表示砝码i的最大数量.  i从0开始                   请你输出不同重量的种数.如:w=[1,2], n=[2,1], 则输出5(分析:共有五种重量:0,1,2,3,4) 解题 参考智力题砝码称重

蓝桥杯——说好的进阶之砝码称重(贪心算法)

5个砝码 用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量. 如果只有5个砝码,重量分别是1,3,9,27,81.则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中). 本题目要求编程实现:对用户给定的重量,给出砝码组合方案. 例如: 用户输入: 5 程序输出: 9-3-1 用户输入: 19 程序输出: 27-9+1 要求程序输出的组合总是大数在前小数在后. 可以假设用户的输入的数字符合范围1~121. public static void main(String

51nod 1449 砝码称重 (进制思想)

1449 砝码称重 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 现在有好多种砝码,他们的重量是 w0,w1,w2,...  每种各一个.问用这些砝码能不能表示一个重量为m的东西. 样例解释:可以将重物和3放到一个托盘中,9和1放到另外一个托盘中. Input 单组测试数据. 第一行有两个整数w,m (2 ≤ w ≤ 10^9, 1 ≤ m ≤ 10^9). Output 如果能,输出YES,否则输出NO.

J - 砝码称重 改自51nod1449

J - 砝码称重 Time Limit: 2000/1000 MS (Java/Others)      Memory Limit: 128000/64000 KB (Java/Others) Submit Status Problem Description 有一个物品和一些已知质量的砝码和天平,问能不能用这些砝码称出这个物品的重量(天平两边都可以放砝码) Input 多样例输入,样例数<=20000 对于每个样例: 第一行输入两个数n,m,表示砝码数量和重物质量,1 ≤ m ≤ 1018 第

wiki 2144 砝码称重 2 STL_map

前言       最近学习C#,不过好在当初考计算机二级学习过C++,刚上手没有对C#感到很恐惧.C#视频也看了几天 了,总感觉不总结一下心里没底,现在跟着我从头走进C#之旅吧.     C#是以后总面向对象的编程语言(OOP),C#是从C和C++派生出来的,主要用于开发可以运行在.NET平台 上的应用程序.随着.NET的发展,C#语言简单.现代.面向对象和类型安全显示了一定的优势.     下面我就介绍一些初学者不太理解的一些东西.   C#有以下突出的特点       (1)语法简洁.不允许

C程序设计的抽象思维-递归过程-砝码称重

[问题] 在狄更斯时代,商人们用砝码和天平来称量商品的重量,如果你只有几个砝码,就只能精确地称出一定的重量.例如,假定只有两个砝码:分别是1kg和3kg.只用1kg的砝码可以称出1kg重量的商品,只用3kg的砝码可以称出3kg重量的商品.1kg和3kg的砝码放在天平同一边可以称出4kg重量的商品,放在不同边可以称出2kg重量的商品.因此利用这两个砝码,我们可以称出重量分别为1.2.3.4kg的商品. 编写一个递归函数: bool IsMeasurable(int target, int weig