1. 程式人生 > >1720: 最少硬幣問題

1720: 最少硬幣問題

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。

輸出

輸出資料只有一個整數,表示計算出的最少硬幣數。問題無解時輸出-1。

樣例輸入

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;
}