原題描述如下:
公元前五世紀(jì)轮纫,我國古代數(shù)學(xué)家張丘建在《算經(jīng)》一書中提出了“百雞問題”:雞翁一只錢五,雞母一只錢三焚鲜,雞雛三只錢一掌唾。百錢買百雞放前,問雞翁、雞母郑兴、雞雛各幾何犀斋?
現(xiàn)要求你打印出所有花一百元買一百只雞的方式。
解題思路
我假設(shè)公雞情连、母雞叽粹、小雞各x、y却舀、z只虫几,那么滿足下列條件:
x + y + z = 100
5x + 3y + z/3 = 100
我們能想到最簡單粗暴的求解方法是,3層循環(huán)解決:
for(int x = 0; x <= 20; x++) {
for(int y = 0; y <= 25; y++) {
for(int z = 0; z <= 100; z += 3) {
if(x + y + z == 100 && 5 * x + 3 * y + z / 3 == 100) {
printf("%d %d %d\n", x, y, z);
}
}
}
}
這顯然不是最優(yōu)解題思路挽拔。
優(yōu)化一
我們將第2個(gè)等式兩邊x3辆脸,得到等式3:
15x + 9y + z = 300
再將等式3與等式1相減,得到:
14x + 8y = 200
即:
7x + 4y = 100
與等式1比較螃诅,可得:
7x + 4y = x + y + z
即:
z = 6x + 3y
因此求解過程如下:
for(int x = 0; x <= 20; x++) {
for(int y = 0; y <= 25; y++) {
if(7 * x + 4 * y == 100) {
int z = 6 * x + 3 * y;
printf("%d %d %d\n", x, y, z);
}
}
}
此解法將3層循環(huán)優(yōu)化為2層循環(huán)啡氢,我們進(jìn)一步優(yōu)化:
優(yōu)化二
我們對等式7x+4y = 100
稍加變換可以得到:
7x = 100 - 4y
可以得出如下結(jié)論:
-
100-4y
是個(gè)偶數(shù),且一定能被4整除 -
7x
也是偶數(shù)术裸,且能被4整除
因7是質(zhì)數(shù)倘是,故滿足7x能被4整除的條件是,x是4的倍數(shù),也就是x只能取范圍只能是:
0,4,8,12
我們再變換一下得到:
y = (100 - 7x) / 4
z = 6x + 3y
因此袭艺,1層循環(huán)即可完成求解搀崭,代碼如下:
for(int x = 0; x <= 12; x += 4) {
int y = (100 - 7 * x) / 4;
int z = 6 * x + 3 * y;
printf("%d %d %d\n", x, y, z);
}
此解法的時(shí)間復(fù)雜度為:O(1)。