問題拆解
- 原料重量 (kg) → 克 → 巧克力總塊數 (四捨五入)。
公式:num = (int)(n * 1000 * 55 / 500.0 + 0.5)。
- 小盒 11 塊,大盒 24 塊,求組合使剩餘最少。
雙重迴圈邏輯解析
for (a = 0; a * 11 <= num; a++) // 外層:小盒數量
for (b = 0; b * 24 <= num; b++) // 內層:大盒數量
if (a * 11 + b * 24 <= num) // 總塊數不超限
s = num - (a*11 + b*24); // 剩餘
if (s < min) { min = s; c = a; d = b; }
- 內嵌迴圈:外層跑一輪,內層跑完所有可能,窮舉所有
(a,b) 組合。
c,d 作為最優解暫存變數,最終輸出用它們而非迴圈變數 a,b (迴圈結束時 a,b 已超出有效範圍)。
優化方向
- 迴圈上界可緊縮:
a <= num/11, b <= (num - a*11)/24。
- 若數據範圍大 (num > 10⁵),可用擴展尤幾里得算法求解不定方程
11a + 24b = num - s,但本題 N 小,暴力足夠。
完整可執行代碼
#include
int main() {
double n; scanf("%lf", &n);
int num = (int)(n * 1000 * 55 / 500.0 + 0.5); // 四捨五入
int min = num, bestA = 0, bestB = 0;
for (int a = 0; a * 11 <= num; ++a) {
for (int b = 0; a * 11 + b * 24 <= num; ++b) {
int rem = num - (a * 11 + b * 24);
if (rem < min) { min = rem; bestA = a; bestB = b; }
}
}
printf("裝%d小盒\n裝%d大盒\n剩余%d塊.\n", bestA, bestB, min);
return 0;
}