基礎演算法題-----百元買百雞
阿新 • • 發佈:2019-01-08
基礎演算法題—–百元買百雞
題目:公雞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:以上如若有錯誤,還望不吝指正。