习题解析之:百钱买百鸡A
【问题描述】
我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,如果要求鸡翁、鸡母、鸡雏都不为零,问鸡翁、鸡母、鸡雏各几何?
输入格式
该题目没有输入
输出格式
每行输出一组结果,按鸡翁数、鸡母数、鸡雏数的顺序输出,数字之间用空格分隔;
如果有多组解时,按鸡翁数量由少到多输出;
示例
输出:
x xx xx
x xx xx
xx x xx
【编程思路1】
设购买鸡翁 x 只、鸡母 y 只、鸡雏 z 只,则有
x + y + z = 100
5 * x + 3 * y + z / 3 = 100
直接对可购买的鸡翁、鸡母、鸡雏的只数进行穷举。其中,鸡翁最少 1 只,最多 20 只(100 // 5);鸡母最少 1 只,最多 33 只(100 // 3);鸡雏最少 1 只,最多 98 只(还需至少买鸡翁和鸡母各 1 只)。
编写的源程序如下:

【编程思路2】
上面的程序采用穷举法求解,比较简单。但在穷举结构的设置、穷举参数的选取等方面存在着改进与优化的空间。
一般来说,在采用穷举法进行问题求解时,可从两个方面来优化考虑。
(1)建立简洁的数学模型。
数学模型中变量的数量要尽量少,它们之间相互独立。这样问题解的搜索空间的维度就小。反映到程序代码中,循环嵌套的层次就少。例如,上面的程序中,采用变量 x、y、z 分别表示鸡翁、鸡母、鸡雏的只数,对这 3 个变量穷举,循环嵌套层次为 3 层。实际上这 3 个变量彼此间有两个条件在约束,或者总只数等于 100,或者总钱数为 100 元。因此,可以只穷举 2 个变量,另外一个变量通过约束条件求出,从而将循环嵌套层次减少为 2 层。
(2)减小搜索的空间。
利用已有的知识,缩小数学模型中各个变量的取值范围,避免不必要的计算。反映到程序代码中,循环体被执行的次数就减少。例如,在穷举时,先考虑鸡翁的只数 x,最多为 20 只(即 1 <= x <= 20),再考虑鸡母的只数 y,若采用总钱数不超过 100 约束,则其只数最多为 (100 - x * 5) // 3 只(即 1<= b <= (100 - x * 5) // 3)。这样穷举的循环次数会减少。
采用上述思路优化后的源程序如下:

浙公网安备 33010602011771号