首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C 語言巧克力裝箱問題:雙重迴圈窮舉與最優解搜尋

     編輯:程式設計疑難解答

問題拆解

  1. 原料重量 (kg) → 克 → 巧克力總塊數 (四捨五入)。
    公式:num = (int)(n * 1000 * 55 / 500.0 + 0.5)。
  2. 小盒 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;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved