基础算法题-----百元买百鸡

基础算法题—–百元买百鸡

题目:公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,用100文钱买一百只鸡,其中公鸡,母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100文钱。

首先来分析一下:
设公鸡为x只,母鸡为y只,小鸡为z只,可的
x+y+z=100
5x+3y+z/3=100
由于每种鸡最少1只,所以公鸡最多能有(100 - 3 - 1) / 5只,母鸡最多能有(100 - 5 - 1) / 3只

至此我们便可以编码实现了

// 买公鸡最大数量
int gongJI = (100 - 3 - 1) / 5;
// 买母鸡最大数量
int muJi = (100 - 5 - 1) / 3;
// 因为每种鸡最少一只所以i从1开始
// 公鸡的数量
for (int i = 1; i <= gongJI; i++) {
    // 母鸡的数量
    for (int j = 1; j <= muJi; j++) {
        // 小鸡的数量
        int xiaoJi = 100 - i - j;
        // 公鸡的钱+母鸡的钱+小鸡的钱
        int money = 5 * i + 3 * j + xiaoJi / 3;
        // 因为3只小鸡1分钱所以小鸡的个数取余3等于0,并且花费总额等于100
        if (xiaoJi % 3 == 0 && money == 100) {
            System.out.println("公鸡:" + i + "只,母鸡:" + j + "只,小鸡:"+ xiaoJi + "只");
        }
    }
}

运算结果这里写图片描述

以上的代码虽然解决了我们的问题,但是在实际的应用中太过于复杂了所以我们可以再次对其进行优化。
从上方的输出结果中可以得知公鸡的数量是4的倍数,母鸡的数量为7的递减,小鸡的数量必定是3的倍数。
设公鸡为x只,母鸡为y只,小鸡为z只,可得:
x+y+z=100 ①
5x+3y+z/3=100 ②
解①可得z=100-x-y; ③
将③带入②可得:
5x+3y+(100-x-y)/3=100;
15x+9y+100-x-y=300;
14x+8y=200;
7x+4y=100;
4y=100-7x;

分析后可将代码改进为

// 总共买多少鸡花多少钱
int sum = 100;
// 买公鸡最大数量
int gongJI = (sum - 3 - 1) / 5;
// 因为每种鸡最少一只所以i从1开始
// 公鸡的数量
for (int i = 4; i <= gongJI; i += 4) {
    // 已知公鸡的数量,根据方程4y=100-7x;可得母鸡的数量
    int muJi = (sum - 7 * i) / 4;
    // 已知公鸡和母鸡的数量便可的小鸡的数量
    int xiaoJi = sum - i - muJi;
    // 计算总价
    int money = 5 * i + 3 * muJi + xiaoJi / 3;
    // 小鸡的数量取余3等于0并且总价钱等于100,则符合题意
    if (xiaoJi % 3 == 0 && money == sum && muJi > 0) {
        System.out.println("公鸡:" + i + "只,母鸡:" + muJi + "只,小鸡:"+ xiaoJi + "只");
    }
}

至此,我们变将代码的复杂程度从O(N2)优化成了O(N1)

PS:以上如若有错误,还望不吝指正。

你可能感兴趣的:(算法)