最少硬幣問題(動態規划)


有多個不同面值的硬幣,任意找,輸入金額S,輸出最少硬幣數。

列如:有1,3,5三種面值的硬幣,我有9元錢,能兌換的硬幣數最少是多少枚?5+3+1=9,最少兌換三枚。

0元兌換0個,

1元兌換1個,

2元兌換2個,在1元的基礎上加一個,

3元兌換1個,

4元兌換2個,4-3=1元,在3元的基礎上加一個,

依次類推,所以提煉出動態轉移方程;Min[i]=min(Min[i],Min[i-face[j]]+1),1<=i<=s,Min[i]保存i元兌換最少硬幣數,face[j]表示硬幣面值,初始化時將Min[i]初始化一個較大的數,Min[0]=0。

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 const int inf=0x3f3f3f3f;
 5 const int maxn=1e3;
 6 int Min[maxn];
 7 int face[3]={1,3,5};
 8 int main()
 9 {
10     int s;
11     while(cin>>s)
12     {
13         for(int i=1;i<=s;i++)
14         {
15             Min[i]=inf;//初始化最大值;Min[0]還是為0; 
16         }
17         for(int i=1;i<=s;i++)
18         {
19             for(int j=0;j<3;j++)
20             {
21                 if(face[j]<=i)
22                     Min[i]=min(Min[i],Min[i-face[j]]+1);
23             }
24         }
25         cout<<Min[s]<<endl;
26     }
27     return 0;
28 }
29  

 


免責聲明!

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



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