用100文钱买100只鸡,其中公鸡5文钱1只,母鸡3文钱1只,小鸡1文钱3只。问:公鸡、母鸡 和小鸡各买了几只?
百钱买百鸡
问题描述
用100文钱买100只鸡,其中公鸡5文钱1只,母鸡3文钱1只,小鸡1文钱3只。问:公鸡、母鸡 和小鸡各买了几只?
设计思路
设公鸡、母鸡和小鸡的只数分别为x、y、z,根据题意可得如下方程组: x + y + z = 100 5x + 3y + z / 3 = 100
如果100文钱全买公鸡,最多可买100 / 5 = 20只,所以x的取值范围在0~20之间;如果100文钱全买母鸡,最多可买100 / 3 = 33只,所以y的取值范围在0~33之间;如果100文钱全买小鸡,最多可买99只,所以z的取值范围在0~99之间,且z % 3 = 0。
通过三重循环穷举x、y和z的值。在穷举的过程中,如果x、y和z满足上面的方程组,则得到一 组符合条件的解。
Swift 3.0 代码实现
func buyOneHundredChickens1() {
for x in 0...20 {
for y in 0...33 {
for z in 0...99 where z % 3 == 0 {
if x + y + z == 100 && 5 * x + 3 * y + z / 3 == 100 {
print("公鸡\(x)只,母鸡\(y)只,小鸡\(z)只")
}
}
}
}
}
buyOneHundredChickens1()
改进
func buyOneHundredChickens2() {
for x in 0...20 {
for y in 0...33 {
let z = 100 - x - y
if z >= 0 && z % 3 == 0 && 5 * x + 3 * y + z / 3 == 100 {
print("公鸡\(x)只,母鸡\(y)只,小鸡\(z)只")
}
}
}
}
buyOneHundredChickens2()
算法理解
使用循环进行穷举。
func buyOneHundredChickens1() :循环由内向外,小鸡数从0到99且为3的倍数,母鸡数从0到33,公鸡数从0到20,每次循环,用if语句限制三变量和为100,且总价为100。使用if语句排除无效解。
func buyOneHundredChickens2() :循环由内向外,母鸡数从0到33,公鸡数从0到20,小鸡数可由其它两个变量表示出。此算法,通过穷举外层母鸡数和公鸡数,间接穷举出小鸡数。再通过if语句限制小鸡数满足的表达式(小鸡数大于等于0且小鸡数为3的倍数)和总价为100的表达式,得出解。
该问题求解关键:穷举。利用 循环的特性,列举出3种鸡数的 所有可能值。再通过鸡数满足的表达式、总价满足的表达式,对解进行限制筛选,最终,在计算判断了所有可能性后,得出符合条件的解。