1132: 最少硬幣問題
Time Limit: 1500 ms Memory Limit: 10000 kB
Total Submit : 892 (185 users) Accepted Submit : 240 (131 users) Page View : 8986
設有n 種不同面值的硬幣,各硬幣的面值存於數組T[1:n]中。現要用這些面值的硬幣來找錢。可以使用的各種面值的硬幣個數存於數組Coins[1:n]中。
對任意錢數0≤m≤20001,設計一個用最少硬幣找錢m的方法。
編程任務:
對於給定的1≤n≤10,硬幣面值數組T和可以使用的各種面值的硬幣個數數組Coins,以及錢數m,0≤m≤20001,編程計算找錢m的最少硬幣數。
Input
輸入包括多組測試數據,每組輸入的第一行中只有1 個整數給出n的值,第2 行起每
行2 個數,分別是T[j]和Coins[j]。每組輸入最后1 行是要找的錢數m。
Output
對於每組輸入數據,輸出一行,即計算出最少硬幣數。問題無解時輸出-1。
Sample Input
3 1 3 2 3 5 3 18
Sample Output
5
1 #include<stdio.h> 2 int coin[11],num[11],f[20005]; 3 inline int min(int a,int b){ 4 return a>b?b:a; 5 } 6 int main() 7 { 8 int i,j,k,n,m; 9 scanf("%d",&n); 10 for(i=0;i<n;i++) 11 scanf("%d%d",&coin[i],&num[i]); 12 scanf("%d",&m); 13 for(i=1;i<=m;i++) 14 f[i]=0x7ffffffe; 15 for(i=0;i<n;i++) 16 for(j=1;j<=num[i];j++) 17 for(k=m;k>=coin[i];k--) 18 f[k]=min(f[k],f[k-coin[i]]+1); //遞推方程式 19 printf("%d\n",f[m]<m?f[m]:-1); 20 while(1); 21 return 0; 22 }
比起錢幣個數無限的最少錢幣個數,這個稍微復雜了點,就是多了一個限制,不過有個數限制的這種可以看成0-1問題,重復的看成不同的硬幣來對待就行了!