這是一道典型的貪心算法練習題(杭電 2021 相關練習)。給定金額,使用面額 100、50、10、5、2、1 的硬幣找零,求最少硬幣總數。由於面額系統具有「標準貨幣系統」特性(每個面額都是下一個面額的整數倍或經過驗證的最優組合),貪心策略(優先使用大面額)能保證全域最優解。
n 表示查詢次數(n=0 結束)。m(整數)。m 所需硬幣數之和)。對每個金額 m:
coin 可用數量 = m / coin。m = m % coin。m = 0。#include <stdio.h>
int main() {
int n, m, i, total, coin, count;
int coins[6] = {100, 50, 10, 5, 2, 1};
while (scanf("%d", &n) != EOF && n != 0) {
total = 0;
for (i = 0; i < n; i++) {
scanf("%d", &m);
for (int j = 0; j < 6; j++) {
coin = coins[j];
count = m / coin;
total += count;
m %= coin;
}
}
printf("%d\n", total);
}
return 0;
}
while (scanf("%d", &n) != EOF && n != 0) 同時處理 EOF 與結束標誌。total。若面額系統改為任意集合(如 {1, 3, 4}),貪心會失效(例:金額 6,貪心給 4+1+1=3 枚,最優為 3+3=2 枚),此時需改用動態規劃(DP)求解最少硬幣數。