这里写目录标题

  • 贪心选择的概念
  • 解题的基本思路
    • 对贪心算法的理解
  • 贪心算法的基本流程:
  • 例题
    • 部分背包问题
    • 纸币找零问题
      • 贪心算法与动态规划的区别
    • 坚果保龄球

贪心选择的概念

贪心算法总是做出在当前看来是最好的选择(局部最优解),通过选择局部的最优解最终可以得到整体的最优解。也就是将一个大问题分解成小的问题后,只需考虑小问题的最优解就可以了,最终组成大问题的最优解。这就需要确定每一步所做的贪心选择能够使问题整体最优解。

解题的基本思路

贪心算法基本的解题思路:

⒈ 建立数学模型来描述问题。
⒉ 把求解的问题分成若干个子问题。
⒊ 对每一子问题求解,得到子问题的局部最优解。
⒋ 把子问题的解局部最优解合成原来解问题的一个解。

对贪心算法的理解

尽最大的可能将满足题意的物品(或其他)选中,并尽可能的多选。

贪心算法的基本流程:

Greedy (C) { //C是问题的输入集合即候选集合S = { };  //初始解集合为空集while (not solution(S)) { //集合S没有构成问题的一个解x = select(C);    //在候选集合C中做贪心选择if feasible(S,  x)  //判断集合S中加入x后的解是否可行S = S + {x};C = C - {x};}return S;
}

例题

部分背包问题

虽然这里和刚才说的贪心的做题基本有一些小小的区别,但是大体的思路是相同的。

问题的输入集合即候选集合:表示每个单位金子的价格c[105]和数量a[105]

初始解集合为空集:sum 和total;

在候选集合C中做贪心选择:for循环中的if;

判断集合S中加入x后的解是否可行:for循环中的条件 (条件繁琐时,可以写成函数)

#include<stdio.h>
int a[105], b[105];
float c[105];
int main(void){int i, n, t;float sum, total;scanf("%d %d", &n, &t);for (i = 0; i < n; i++) {scanf("%d %d", &a[i], &b[i]);c[i] = b[i] / (a[i] * 1.0);}sort(0, n - 1); //排序函数,没有放在这里sum = 0;total = 0;for (i = 0; i < n; i++) {if (sum + a[i] <= t) {   sum += a[i];total += a[i] * c[i];} else {total += (t - sum) * c[i];break;}}printf("%.2f", total);return 0;
}

纸币找零问题

题目: 假设1元、2元、5元、10元、20元、50元、100元的纸币分别有c0, c1, c2, c3, c4, c5, c6张。
现在要用这些钱来支付K元,至少要用多少张纸币?

用贪心算法的思想,很显然,每一步尽可能多的用面值大的纸币即可。在日常生活中我们自然而然也是这么做的。

#include<stdio.h>
int min(int n, int m) {if (m > n) {return n;} else {return m;}
}
int main(void) {int k, t = 0, i, c[7], v;int a[6] = {2, 5, 2, 1, 1, 1}; //存储对应面额钱币的张数int b[6] = {1, 5, 10, 20, 50, 100};  //对应的钱币面额scanf("%d", &k);for(i = 5; i >= 0; i--) {v = min(k / b[i], a[i]);  //取某一面额 需要的张数和有的张数的较小值k -= v * b[i];t += v;    //t记录使用的纸币的张数}if (k > 0) {  //所有的纸币搭配无法达到对应的金额t = -1;}if(t == -1) {printf("no\n");} else {printf("%d\n", t);}return 0;
}

贪心算法与动态规划的区别

1.还是以纸币找零问题来说,如果改变纸币的面值为1, 3 ,4 ,想要得到总共为6元的钱。

按照贪心算法来计算就应该是 一张4元,两张1元。显然这不是最优解,所以说,贪心算法不一定能得到最优解,这也就是贪心算法的局限性。

但是如果用动态规划的话,就可以得到最优的解。

2.贪心算法是自顶向下的,而动态规划是自底向上的。

3.贪心算法是动态规划的一种特例,贪心算法可以解决的题目用动态规划也可以解决,但动态规划的部分题目,贪心算法解决不了。

4.同一道题目,贪心算法和动态规划都可以解决,贪心算法的时间复杂度和空间复杂度比动态规划高。

坚果保龄球

这道题也是属于一道贪心算法的题目,目的是用最少的坚果消灭所有僵尸。

#include<stdio.h>
int c[200005];
int main(void) {int n, p[200005], a[200005];int i, j, sum = 0, t = 0, q;scanf("%d", &n);for (i = 0; i < n; i++) {scanf("%d %d", &p[i], &a[i]);c[i] = p[i] * 1000000 + a[i];  //将两个数据构成一个新的数据,数据对这个新的数据排序就可以实现对每行的僵尸进入时间排序。}sort(0, n - 1);  //排序for (i = 0; i < n; i++) {p[i] = c[i] / 1000000;  //重新将数据分离出来a[i] = c[i] % 1000000;}q = a[0];sum = 1;for (i = 1; i < n; i++) {if (q + 60  <= a[i] && p[i - 1] == p[i]) {sum++;  //同一行某一时刻达到了这行的僵尸数最大。q = a[i];//另下一个僵尸进入的时间为起始时间}if (p[i - 1] != p[i]) {  //遍历到第二行,无论上一行什么情况,下一行都得重新开始一个坚果。sum++;q = a[i];}}printf("%d\n", sum);return 0;
}

4.25分享(贪心算法基础)相关推荐

  1. 《趣学算法(第2版)》读书笔记 Part 4 :贪心算法基础(操作)

    14天阅读挑战赛 系列笔记链接 <趣学算法(第2版)>读书笔记 Part 1 :如何高效学习算法 <趣学算法(第2版)>读书笔记 Part 2 :算法入门 <趣学算法(第 ...

  2. 贪心算法基础(一)——数列极差

    贪心算法的思想就是用局部的最优解,达到最后全局的最优解.贪心算法使用是有限制的,一个问题能不能使用贪心来做,往往我们要对其进行必要的证明.贪心算法策略具有无后向性,也就是当前阶段的状态确定之后,不受后 ...

  3. POJ 4151/北大百练 4151 电影节 题解(两种方法)贪心算法基础

    POJ4151 电影节 总时间限制: 1000ms 内存限制: 65536kB 描述: 大学生电影节在北大举办! 这天,在北大各地放了多部电影,给定每部电影的放映时间区间,区间重叠的电影不可能同时看( ...

  4. 152. Leetcode 剑指 Offer 14- II. 剪绳子 II (贪心算法-基础题目)

    class Solution:def cuttingRope(self, n: int) -> int:if n < 4:return n - 1res = 1while n > 4 ...

  5. 151. Leetcode 剑指 Offer 14- I. 剪绳子 (贪心算法-基础题目)

    class Solution:def cuttingRope(self, n: int) -> int:if n <= 3:return n-1a, b = n // 3, n % 3if ...

  6. 150. Leetcode 860. 柠檬水找零 (贪心算法-基础题目)

    有如下三种情况: •情况一:账单是5,直接收下. •情况二:账单是10,消耗一个5,增加一个10 •情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个 5 class Solution ...

  7. 149. Leetcode 1005. K 次取反后最大化的数组和 (贪心算法-基础题目)

    那么本题的解题步骤为: 第一步:将数组按照绝对值大小从大到小排序,注意要按照绝对值的大小 第二步:从前向后遍历,遇到负数将其变为正数,同时K-- 第三步:如果K还大于0,那么反复转变数值最小的元素,将 ...

  8. 148. Leetcode 455. 分发饼干 (贪心算法-基础题目)

    class Solution:def findContentChildren(self, g: List[int], s: List[int]) -> int:g.sort()s.sort()m ...

  9. 贪心算法基础之活动时间安排(一)安排 51nod 贪心教程

    有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动? 输入 第1行:1个数N,时间段的数量(2 <= N <= 10000) 第2 ...

最新文章

  1. 电气期刊论文实现:基于输电线路容量安全约束的电力机组组合
  2. 学生上课睡觉班主任怎么处理_【师问师答】学生上课说话,点名批评还嘴怎么办?...
  3. MySQL入门 (五) : CRUD 与资料维护
  4. 升级ipython_Linux服务器python升级
  5. 传智播客学python_传智播客python 12天学会Python系列视频 177个视频教程 完整学习Python编程...
  6. 目标检测---利用labelimg制作自己的深度学习目标检测数据集
  7. FPS游戏:实现GDI方框透视
  8. 地学计算方法/地统计学(第二章地理数据及其采集与预处理)
  9. 凉州馆中与诸判官夜集
  10. PS3安装Linux Fedora Core 6教程
  11. 经常使用传感器协议3:CJ/T-188 冷热量表协议解析2
  12. 程序员转行适合做什么?
  13. qq邮箱 添加 gmail_将您的Gmail添加到Windows Live Mail
  14. Word2019修改背景色失效的解决方法
  15. 如何对某一个文件夹下的所有文件快速重命名
  16. 深度学习_深度学习基础知识_Internal Covariate Shift
  17. 小猫爪:i.MX RT1050学习笔记26-RT1xxx系列的FlexCAN详解
  18. iview 下拉select样式_iview的select组件的列表样式和点击都无效
  19. 联发科技嵌入式_【MTK联发科技嵌入式驱动工程师面试】面试官人很好,问的问题很基础。-看准网...
  20. S32K系列S32K144学习笔记——CAN

热门文章

  1. python练习题,使用爬虫爬取百度百科内置BeautifulSoup安装方法
  2. 大四实习生的日常(一)
  3. 【已解决】python读取ods:linux中ods文件内容无法访问,代码无法测试;shuffle的作用:随机从数据集里面读取大小为batch_size的数据
  4. 计算机英语单词练习二
  5. linux改主机名redhat7永久,云服务器centos7永久更改主机名
  6. How to deal with blurred picture
  7. 群晖命令行获取root权限
  8. 兄弟连视频教程下载地址汇总-2014(转)
  9. 走在技术这条阳光大道上
  10. map遍历的三种基础用法