题目:
输入
C,=3,C。=2,C。=1,C。=3,C0=0,Cs0=2,A= 620
输出
6 (500元硬币1枚,50元硬币2枚,10元硬币1枚,5元硬币2枚,合计6枚)
分析:
这是个贴近生活的简单问题。凭直觉,可以得出如下正确的解答。
■首先尽可能多地使用500元硬币;
■剩余部分尽可能多地使用100元硬币;
■剩余部分尽可能多地使用50元硬币;
■剩余部分尽可能多地使用10元硬币;
■剩余部分尽可能多地使用5元硬币;
■最后的剩余部分使用1元硬币支付。
或者,简而言之,
■优先使用面值大的硬币。
该算法可以说是贪心算法中最简单的例子。上节的搜索算法和下节的动态规划算法是在多种策略中选取最优解,而贪心算法则不同,它遵循某种规则,不断地选取当前最优策略。例如在此题中,“优先使用面值大的硬币”就是在计算过程中所遵循的规则。并且,我们只考虑“尽可能多的使用面值大的硬币”这一-种当前最优策略。
如果问题能够用贪心算法来求解的话,那么它通常是非常高效的。如果把这里的硬币问题当作-种背包问题,那么比起用动态规划算法求解,贪心算法更简单高效。
代码实现:
#include<iostream>
#include<vector>
using namespace std;
vector<int>C(6,0);//张数
vector<int>D= {1,5,10,50,100,500};//面值
int A;
void solve() {
int sum=0;
for(int i=5; i>-1; --i) {
int t=min(A/D[i],C[i]);//每种面值最多能用多少张
A-=t*D[i];
sum+=t;
if(!A)
break;
}
cout<<sum;
}
int main() {
for(int i=0; i<6; ++i)
cin>>C[i];
cin>>A;
solve();
return 0;
}