贪心算法求解找零钱问题
1.什么是贪心算法?
-
贪心算法是一种策略,总是做出在当前看来是最好的选择,总结出来几个字:寻找最优解
-
举个例子来说就是:“有一个只能往前走的果园,里边有各种水果让你免费摘,免费摘嘛当然找值钱的摘,所以一开始你就直接选择最贵的石榴,石榴摘完后再摘哪个?看看前边有香蕉和葡萄,比较了一下摘了香蕉,香蕉过后继续往前走,然后摘了橘子……,最后一条路走下来了,你摘了石榴、香蕉、橘子、苹果、桃子,总价值为25元”,故事到此结束,当你抱着一堆25元钱水果回来的时候,你已经寻找到了最优解,贪心算法就是这样的一种策略,根据眼前的条件进行取舍去寻找最优解;
2.找零钱问题构思
找零钱当然要尽快把钱找给对方,怎么做到最快,就是先取最大的钞票,然后再逐渐用小钞票,打个比方,如果你要找我32块钱,那最快的方法就是从你钱包里取出三张10块的,两张1块的, 利用贪心算法就是先看看最大钞票够不够找零,够的话先用最大的钞票,再用小的钞票;
3.代码部分
说了这么多,还是来看代码理解的快些。
#include<iostream>
using namespace std;
int main()
{
int temp,num=0; //temp为某种币值需要多少张钱,num为总共需要多少张
int n=7;
int moneylist[7] = { 5,1,2,3,2,4,1 };
int moneyvalue[7] = { 1,2,5,10,20,50,100 };
int k; //要找的钱
cout << "请输入要找的钱数" << endl;
cin >> k;
for (int i = 6; i >= 0; i--) { //找零钱操作
temp = k / moneyvalue[i];
if (temp <= moneylist[i]) {
num += temp;
k -= temp * moneyvalue[i];
cout << moneyvalue[i] << "元的钱" << temp << "张" << endl;
}
else {
num += moneylist[i];
k -= moneylist[i] * moneyvalue[i];
cout << moneyvalue[i] << "元的钱" << moneylist[i] << "张" << endl;
}
if (k == 0) break;
}
if (k != 0) cout << "您还缺少" << k << "元去找零" << endl;
if(k==0) cout << "一共至少需要" << num << "张纸币" << endl;
return 0;
}
4. 运行结果
对于上边讲的摘水果问题想必你还有疑问,有没有一种路线使得自己拿的水果最值钱呢?有可能一开始选择最不值钱的桃子,接下来有可能会遇到榴莲、椰子等超级贵的水果,那么一路走下来摘的水果肯定比25元贵,所以如果有很多次机会去尝试的话,你肯定能找到一条最好的路线使拿到的水果最贵,至于这个过程,就是后续的推导整体最优解过程,这可能涉及回溯法等算法,有兴趣可以去了解一下。
今天就到这里,该吃饭了,拜。