题解 | #百钱买百鸡问题#
百钱买百鸡问题
http://www.nowcoder.com/practice/74c493f094304ea2bda37d0dc40dc85b
题目的主要信息:
鸡翁一只值五元,鸡母一只值三元,三只鸡雏值一元。要求出所有花一百元买一百只鸡的方式。
方法一:
解方程。鸡翁、鸡母、鸡雏分别为x, y, z 三个变量,这三个变量满足以下两个方程式:
- x+y+z=100
- 5x+3y+z/3=100
y可以表示,z可以表示为,因此,只要确定x的值即可算出y和z,需要注意的是x、y、z均为非负数,因此x的范围为0-3。
具体做法:
#include<iostream>
using namespace std;
//鸡翁、鸡母、鸡雏分别为x, y, z 三个变量。
//x+y+z=100
//5x+3y+z/3=100
//确定x即可算出y和z,若y和z为非负整数,则为有效结果,输出。
int main(){
for(int x=0;x<=3;x++){
cout<<4*x<<" "<<25-7*x<<" "<<75+3*x<<endl;
}
return 0;
}
复杂度分析:
- 时间复杂度:,直接计算,只用了常数时间。
- 空间复杂度:,只用了常数空间。
方法二:
暴力法。首先确定边界,如果100元全部用来买公鸡可以买20只,如果全部用来买母鸡,可以买33只,如果全部用来买小鸡可以买100只(最多100只鸡)。因此用三重for循环枚举所有可能的购买组合,选出其中满足鸡的总数等于100,且总共花了100元条件的组合输出。
具体做法:
#include<iostream>
using namespace std;
int main(){
for(int i = 0; i <= 20; i++) {
for(int j = 0; j <= 33; j++) {
for(int k = 0; k <= 100; k++){ //遍历所有可能的公鸡、母鸡、小鸡取值
if(i + j + k == 100 && 5 * i + 3 * j + double(k) / 3 == 100) {//鸡的总数等于100,且总共花了100元
cout << i << " " << j << " " << k << endl;
}
}
}
}
return 0;
}
复杂度分析:
- 时间复杂度:,循环大小是固定的常数。
- 空间复杂度:,只用了常数空间。