题目的主要信息:

鸡翁一只值五元,鸡母一只值三元,三只鸡雏值一元。要求出所有花一百元买一百只鸡的方式。

方法一:

解方程。鸡翁、鸡母、鸡雏分别为x, y, z 三个变量,这三个变量满足以下两个方程式:

  • x+y+z=100
  • 5x+3y+z/3=100

y可以表示257x25-7*x,z可以表示为75+3x75+3*x,因此,只要确定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;
}

复杂度分析:

  • 时间复杂度:O(1)O(1),直接计算,只用了常数时间。
  • 空间复杂度:O(1)O(1),只用了常数空间。

方法二:

暴力法。首先确定边界,如果100元全部用来买公鸡可以买20只,如果全部用来买母鸡,可以买33只,如果全部用来买小鸡可以买100只(最多100只鸡)。因此用三重for循环枚举所有可能的购买组合,选出其中满足鸡的总数等于100,且总共花了100元条件的组合输出。 alt

具体做法:

#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;
}


复杂度分析:

  • 时间复杂度:O(1)O(1),循环大小是固定的常数。
  • 空间复杂度:O(1)O(1),只用了常数空间。