最少硬币问题(动态规划)


有多个不同面值的硬币,任意找,输入金额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