最少硬幣問題


 1132: 最少硬幣問題

Time Limit: 1500 ms    Memory Limit: 10000 kB  
Total Submit : 892  (185 users)    Accepted Submit : 240  (131 users)    Page View : 8986 
Font Style: Aa Aa Aa

設有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問題,重復的看成不同的硬幣來對待就行了!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM