4.25分享(贪心算法基础)
这里写目录标题
- 贪心选择的概念
- 解题的基本思路
- 对贪心算法的理解
- 贪心算法的基本流程:
- 例题
- 部分背包问题
- 纸币找零问题
- 贪心算法与动态规划的区别
- 坚果保龄球
贪心选择的概念
贪心算法总是做出在当前看来是最好的选择(局部最优解),通过选择局部的最优解最终可以得到整体的最优解。也就是将一个大问题分解成小的问题后,只需考虑小问题的最优解就可以了,最终组成大问题的最优解。这就需要确定每一步所做的贪心选择能够使问题整体最优解。
解题的基本思路
贪心算法基本的解题思路:
⒈ 建立数学模型来描述问题。
⒉ 把求解的问题分成若干个子问题。
⒊ 对每一子问题求解,得到子问题的局部最优解。
⒋ 把子问题的解局部最优解合成原来解问题的一个解。
对贪心算法的理解
尽最大的可能将满足题意的物品(或其他)选中,并尽可能的多选。
贪心算法的基本流程:
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分享(贪心算法基础)相关推荐
- 《趣学算法(第2版)》读书笔记 Part 4 :贪心算法基础(操作)
14天阅读挑战赛 系列笔记链接 <趣学算法(第2版)>读书笔记 Part 1 :如何高效学习算法 <趣学算法(第2版)>读书笔记 Part 2 :算法入门 <趣学算法(第 ...
- 贪心算法基础(一)——数列极差
贪心算法的思想就是用局部的最优解,达到最后全局的最优解.贪心算法使用是有限制的,一个问题能不能使用贪心来做,往往我们要对其进行必要的证明.贪心算法策略具有无后向性,也就是当前阶段的状态确定之后,不受后 ...
- POJ 4151/北大百练 4151 电影节 题解(两种方法)贪心算法基础
POJ4151 电影节 总时间限制: 1000ms 内存限制: 65536kB 描述: 大学生电影节在北大举办! 这天,在北大各地放了多部电影,给定每部电影的放映时间区间,区间重叠的电影不可能同时看( ...
- 152. Leetcode 剑指 Offer 14- II. 剪绳子 II (贪心算法-基础题目)
class Solution:def cuttingRope(self, n: int) -> int:if n < 4:return n - 1res = 1while n > 4 ...
- 151. Leetcode 剑指 Offer 14- I. 剪绳子 (贪心算法-基础题目)
class Solution:def cuttingRope(self, n: int) -> int:if n <= 3:return n-1a, b = n // 3, n % 3if ...
- 150. Leetcode 860. 柠檬水找零 (贪心算法-基础题目)
有如下三种情况: •情况一:账单是5,直接收下. •情况二:账单是10,消耗一个5,增加一个10 •情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个 5 class Solution ...
- 149. Leetcode 1005. K 次取反后最大化的数组和 (贪心算法-基础题目)
那么本题的解题步骤为: 第一步:将数组按照绝对值大小从大到小排序,注意要按照绝对值的大小 第二步:从前向后遍历,遇到负数将其变为正数,同时K-- 第三步:如果K还大于0,那么反复转变数值最小的元素,将 ...
- 148. Leetcode 455. 分发饼干 (贪心算法-基础题目)
class Solution:def findContentChildren(self, g: List[int], s: List[int]) -> int:g.sort()s.sort()m ...
- 贪心算法基础之活动时间安排(一)安排 51nod 贪心教程
有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动? 输入 第1行:1个数N,时间段的数量(2 <= N <= 10000) 第2 ...
最新文章
- 电气期刊论文实现:基于输电线路容量安全约束的电力机组组合
- 学生上课睡觉班主任怎么处理_【师问师答】学生上课说话,点名批评还嘴怎么办?...
- MySQL入门 (五) : CRUD 与资料维护
- 升级ipython_Linux服务器python升级
- 传智播客学python_传智播客python 12天学会Python系列视频 177个视频教程 完整学习Python编程...
- 目标检测---利用labelimg制作自己的深度学习目标检测数据集
- FPS游戏:实现GDI方框透视
- 地学计算方法/地统计学(第二章地理数据及其采集与预处理)
- 凉州馆中与诸判官夜集
- PS3安装Linux Fedora Core 6教程
- 经常使用传感器协议3:CJ/T-188 冷热量表协议解析2
- 程序员转行适合做什么?
- qq邮箱 添加 gmail_将您的Gmail添加到Windows Live Mail
- Word2019修改背景色失效的解决方法
- 如何对某一个文件夹下的所有文件快速重命名
- 深度学习_深度学习基础知识_Internal Covariate Shift
- 小猫爪:i.MX RT1050学习笔记26-RT1xxx系列的FlexCAN详解
- iview 下拉select样式_iview的select组件的列表样式和点击都无效
- 联发科技嵌入式_【MTK联发科技嵌入式驱动工程师面试】面试官人很好,问的问题很基础。-看准网...
- S32K系列S32K144学习笔记——CAN