1.贪心算法
定义:贪心算法也叫贪婪算法,是指在求解问题时总是做出在当前看来是最好的选择。即不从整体最优方面考虑,仅是在某种意义上的局部最优解。
2.贪心算法的思路
从问题的某一个初始解出发,逐步逼近给定的目标,以便尽快求出更好的解。当达到算法的某一步不能继续前进时,就停止算法,给出一个近似解。
2.1贪心算法的三个问题
(1) 不能保证最后的解是最优解;
(2) 不能用来求最大或最小解问题;
(3) 只能求某些满足约束条件的可行解的范围。
2.2贪心算法的基本思路
(1) 建立数学模型来描述问题;
(2) 把求解的问题拆分成各个子问题;
(3) 对每一个子问题求解,得到子问题的局部最优解;
(4) 把子问题的最优解结合起来形成原问题的解。
2.3贪心算法的过程
(1) 从问题的某一初始解出发;
(2) while能向给定目标进一步;
(3) 求出可行解的一个解元素;
(4) 由所有解元素组合成问题的一个解。
3.贪心算法实例(C++)
-
找零方案,人名币有100、50、10、5、1、0.5、0.1等多种面值,单位为元,在找零时有多种方案,例如68.90元,至少有一下三种方案:
1张50 1张10 1张5 3张1 1张0.5 4张0.1;
2张20 2张10 1张5 3张1 1张0.5 4张0.1;
6张10 1张5 3张1 1张0.5 4张0.1; -
实现思路:将面值扩大100倍,只为简化运算过程;
设计面值数组 Money[7] = {10000,5000,1000,500,100,50,10};
设计计数数组 Num[7] = {0};
Num数组与Money数组对应下标分别表示面值与面值数量;
#include<iostream>
#define MAXN 7
using namespace std;
double Money[MAXN] = { 10000, 5000, 1000, 500, 100, 50, 10 };
double Num[MAXN] = { 0 };
void exchange(double n) //n 为所找零钱扩大100倍后的值
{
int i;
for (i = 0; i < MAXN; i++)
if (n > Money[i])
break; //找到比n小的最大面值,Money数组内部值由大到小
while (n > 0 && i < MAXN)
{
if (n >= Money[i])
{
n -= Money[i];
Num[i]++;
}else if (n < 10 && n >= 5) //此时考虑百分位上的数,四舍五入; 74.56-->74.6; 74.53-->74.5
{
Num[MAXN - 1]++; //Money数组最后的最小值增一,表示四舍五入
break;
}
else i++;
}
}
int main()
{
double m = 0;
cout<<"请输入找零的金额:"<<endl;
cin >> m;
exchange(100*m);
cout << m << "元零钱组成:" << endl;
for (int i = 0; i < MAXN; i++)
{
if (Num[i] > 0)
{
cout << "面值 "<<Money[i] / 100 <<" ----共需要 "<< Num[i]<< " 张" << endl;
}
}
//system("pause");
return 0;
}