1720: 最少硬幣問題
阿新 • • 發佈:2018-11-09
1720: 最少硬幣問題
時間限制: 1 Sec 記憶體限制: 64 MB提交: 88 解決: 27
[提交][狀態][討論版][命題人:外部匯入]
題目描述
設有n種不同面值的硬幣,各硬幣的面值存於陣列T[1:n]中。現要用這些面值的硬幣來找錢。可以使用的各種面值的硬幣個數存於陣列Coins[1:n]中。 對任意錢數0≤m≤20001,設計一個用最少硬幣找錢m的方法。 對於給定的1≤n≤10,硬幣面值陣列T和可以使用的各種面值的硬幣個數陣列Coins,以及錢數m,0≤m≤20001,計算找錢m的最少硬幣數。輸入
輸入資料第一行中只有1個整數給出n的值,第2行起每行2個數,分別是 T[j]和Coins[j]。最後1行是要找的錢數m。輸出
樣例輸入
3
1 3
2 3
5 3
18
樣例輸出
5
#include<stdio.h> #define MAX 1000000 int t[MAX], coins[MAX], f[MAX]; int min(int a, int b) { return (a < b ? a : b); } int main() { int n, m, i, j, k; scanf("%d", &n); for(i = 0; i < n; ++i) { scanf("%d %d", &t[i], &coins[i]); } scanf("%d", &m); for(i = 1; i <= m; ++i) f[i] = MAX; for(i = 0; i < n; ++i) for(j = 0; j < coins[i]; ++j) for(k = m; k >= t[i]; --k) f[k] = min(f[k], f[k - t[i]] + 1); printf("%d\n", f[m] <= m ? f[m] : -1); return 0; }