题目的主要信息:

  • 公鸡一只5元,母鸡一只3元,小鸡三只一元
  • 打印出所有100元买100只鸡的情况
  • 题目输入的是无用信息

方法一:暴力枚举

具体做法:

从题干信息我们可以得到,100元最多可以买25只公鸡,可以买33只母鸡,可以买100只小鸡,而每种鸡都可以是0只,因此每种鸡的范围就找到了,我们只要三层遍历,依次是上述三种鸡的每种可能性,然后计算每种可能性下是否满足鸡的总数要等于100,花费的金额要等于100的情况,满足才能打印。

alt

#include<iostream>
using namespace std;

int main(){
    int n;
    cin >> n; //任意输入
    double total = 100;
    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 * double(i) + 3 * double(j) + double(k) / 3 == total) //鸡的总数等于100且花费金额也等于100
                    cout << i << " " << j << " " << k << endl;
    return 0;
}

复杂度分析:

  • 时间复杂度:O(1)O(1),所有的数字已知,可以看成一个常数时间,也可以将100看成是nn,那么总共遍历(n/5)(n/3)(n)(n/5)(n/3)(n)次,即为O(n3)O(n^3)
  • 空间复杂度:O(1)O(1),无额外空间

方法二:解方程

具体做法:

这不过就是一个5x+3y+(100xy)/3=1005x+3y+(100-x-y)/3=100的二元一次方程,化简解得:y=257x/4y=25-7x/4,因为都是整数,所以公鸡的数量必须是4的倍数,同时,要保证母鸡数量不为负数,那么公鸡的数量就只能在0只到3只之间,那我们只就知道方程的解为:

  • 公鸡:4x4 * x
  • 母鸡:257x25 - 7 * x
  • 小鸡:75+3x75+3*x

其中上述0<=x<=30<=x<=3,我们只要遍历0-3依次输出即可。

#include<iostream>
using namespace std;

int main(){
    int n;
    cin >> n; //任意输入
    for(int i = 0; i <= 3; i++)
        cout << 4 * i << " " << 25 - 7 * i << " " << 75 + 3 * i << endl;
    return 0;
}

复杂度分析:

  • 时间复杂度:O(1)O(1),常数时间
  • 空间复杂度:O(1)O(1),常数空间