對給定 n,找非負整數 x≤y≤z 使 x²+y²+z²=n。n ≤ 10000 左右。
三重循環 + 剪枝:
for (int i=1; i*i<=n; ++i)
for (int j=i; j*j<=n; ++j)
for (int k=j; k*k<=n; ++k)
if (i*i + j*j + k*k == n) { output; goto END; }
goto 直接跳出多層循環,簡潔高效。
有 150/200/350 三種包裝,買滿 m 最少剩多少。m ≤ 100000 左右。
三重循環枚舉三種包裝數量,計算剩餘取最小。剪枝條件 i*150 <= m 等大幅減少迭代。
i≤j≤k)i*i <= n 而非 i <= n)goto 或標記變量跳出多層循環// HDU 1407 #includeint main() { int n; while (scanf("%d", &n) == 1) { int x=0,y=0,z=0; for (int i=1; i*i<=n; ++i) for (int j=i; j*j<=n; ++j) for (int k=j; k*k<=n; ++k) if (i*i+j*j+k*k == n) { x=i; y=j; z=k; goto OUT; } OUT: printf("%d %d %d\n", x,y,z); } return 0; } // HDU 1248 #include int main() { int T; scanf("%d", &T); while (T--) { int m, ans=1e9; scanf("%d", &m); for (int i=0; i*150<=m; ++i) for (int j=0; j*200<=m; ++j) for (int k=0; k*350<=m; ++k) { int used = i*150 + j*200 + k*350; if (used <= m) ans = min(ans, m-used); } printf("%d\n", ans); } return 0; }
暴力枚舉不是「無腦嘗試」,而是「在約束條件下精心設計循環邊界與剪枝」。對於中小規模數據,優化得當的暴力往往是工程上的最優解。