有多個不同面值的硬幣,任意找,輸入金額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