【Day3】阅读趣学算法

14天阅读挑战赛
努力是为了不平庸~

算法介绍

贪心算法(又称贪婪算法) 是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的 局部最优解
在实践利用贪心算法求解的问题往往具有两个重要性质:

  1. 贪心选择: 指原问题的整体最优解可以通过一系列局部最优的选择得到。
  2. 最优子结构: 即一个问题的最优解包含其子问题的最优解时。
    (注:问题最优子结构性质是该问题是否可用贪心算法求解的关键

贪心算法的基本步骤

基本思路:

  1. 建立数学模型来描述问题;
  2. 把求解的问题分成若干个子问题;
  3. 对每一子问题求解,得到子问题的局部最优解;
  4. 把子问题的解局部最优解合成原来解问题的一个解。

算法实现:

  1. 从问题的某个初始解出发。
  2. 采用循环语句,当可以向求解目标前进一步时,就根据局部最优策略,得到一个部分解,缩小问题的范围或规模。
  3. 将所有部分解综合起来,得到问题的最终解。

实例分析

找零钱问题

现在店家有1元、5元、10元、50元、100元和500元硬币各c1,c2,c3,c4,c5,c6枚。现在要用这些硬币来给顾客找零钱A元,假设店家找给顾客所需的零钱金额必须是刚刚好,不能多也不能少,最少需要多少枚硬币?

限制条件

0≤ c1,c2,c3,c4,c5,c6≤1000000000

0≤A≤1000000000

依次输入c1,c2,c3,c4,c5,c6和A,以空格分隔,输出最少所需硬币数,如果该金额不能由所给硬币凑出,则返回NOWAY
输入

3 2 1 3 0 2 620

输出

6

问题分析:
需要找零的钱为m,现有零钱种类c1、c2、c3、…cn,每种钱数量无限,如何找到最少的硬币实现找零?

  1. 限制条件:找的零钱总和等于m;
  2. 最优函数:硬币数量最少;
  3. 可行解:要找的钱的组合方式有很多;
  4. 最优解:找到零钱并且硬币最少。

模板代码:

#include<iostream>
using namespace std;
int main(void){
   long long numb[6],A;
   int sum=0;
   int value[6]={1,5,10,50,100,500};
   for(int i=0;i<6;i++)
   {
   	cin>>numb[i];
   }
   cin>>A;
   for (int i = 5; A > 0; i--)
	{
		int count = numb[i];
		int c=0;
		if (A > value[i])
		{ 
			c = A / value[i];
			if (c > count)
			{
				sum =sum + count;
				A =A- count * value[i];
			}
			else
			{
				sum =sum+ c;
				A =A- c * value[i];
			}
			
		}
	}
	cout<<sum<<endl;
}

测试结果:

3 2 1 3 0 2 620
6

--------------------------------
Process exited after 13.84 seconds with return value 0
请按任意键继续. . .


贪心算法总结

  1. 适合贪心算法具有的特征:

  2. 优化问题。

  3. 问题的求解可以划分为若干阶段。

  4. 能够制定出最优量度标准。

  5. 问题具有最优子结构性质。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开摆C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值