1. 程式人生 > >基礎演算法題-----百元買百雞

基礎演算法題-----百元買百雞

基礎演算法題—–百元買百雞

題目:公雞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:以上如若有錯誤,還望不吝指正。