《孫子算經》中的「百錢百雞」是窮舉法的經典入門題。本文從最直觀的三層迴圈開始,逐步優化至單層迴圈,並統計各版本迴圈執行次數,直觀展示算法優化的威力。
公雞 5 元/隻,母雞 3 元/隻,小雞 1 元/3 隻。用 100 元買 100 隻雞,問公、母、小雞各幾隻?
for ($g = 0; $g <= 100; ++$g) {
for ($m = 0; $m <= 100; ++$m) {
for ($x = 0; $x <= 100; ++$x) {
if ($g*5 + $m*3 + $x/3 == 100 && $g + $m + $x == 100) { ... }
$count++;
}
}
}
$x = 100 - $g - $m;
if ($g*5 + $m*3 + $x/3 == 100) { ... }
for ($g = 0; $g <= 100/5; ++$g) { // 公雞最多 20 隻
for ($m = 0; $m <= 100/3; ++$m) { // 母雞最多 33 隻
$x = 100 - $g - $m;
if ($g*5 + $m*3 + $x/3 == 100) { ... }
}
}
for ($g = 0; $g <= 20; ++$g) {
for ($m = 0; $m <= (100 - $g*5)/3; ++$m) { // 扣除公雞花費後的剩餘錢
$x = 100 - $g - $m;
if ($g*5 + $m*3 + $x/3 == 100) { ... }
}
}
if ($x % 3 != 0) continue; // 提前跳過不可能的組合
| 公雞 | 母雞 | 小雞 |
|---|---|---|
| 0 | 25 | 75 |
| 4 | 18 | 78 |
| 8 | 11 | 81 |
| 12 | 4 | 84 |
同樣的窮舉思想,透過數學洞察即可將效能提升 8500 倍(1,030,301 → 121)。