贪心算法

贪心算法

纵然是瞬间 提交于 2020-03-24 10:50:54
55. 跳跃游戏 难度 中等 510 给定一个非负整数数组,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个位置。 示例 1: 输入: [2,3,1,1,4] 输出: true 解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。 示例 2: 输入: [3,2,1,0,4] 输出: false 解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。 1 class Solution: 2 def canJump(self, nums: List[int]) -> bool: 3 if not nums: 4 return True 5 6 nums_len = len(nums) 7 #good_positions[index] = True 代表从index能到达最后一个位置 8 good_positions = [False for _ in range(nums_len)] 9 good_positions[nums_len-1] = True 10 min_good_position = nums_len - 1 11 12 for index in range(nums_len-2, -1, -1)

贪心算法_01背包问题_Java实现

烈酒焚心 提交于 2020-03-23 20:30:52
原文地址: http://blog.csdn.net/ljmingcom304/article/details/50310789 本文出自:【梁敬明的博客】 1.贪心算法   什么是贪心算法?是指在对问题进行求解时,总是做出当前看来是最好的选择。也就是说,不从整体最优上加以考虑,所得出的结果仅仅是某种意义上的局部最优解。因此贪心算法不会对所有问题都能得到整体最优解,但对于很多问题能产生整体最优解或整体最优解的近似解。 2背包问题     一个旅行者有一个最多能装m公斤的背包,现在有n中物品,每件的重量分别是W1、W2、……、Wn,每件物品的价值分别为C1、C2、……、Cn, 需要将物品放入背包中,要怎么样放才能保证背包中物品的总价值最大? 3.算法分析     当遇到这样的问题,我们可以换一种角度去思考,假设在一个100m3的房子里面,现在要将房子装满,同时要保证放入的物品个数最多以及装入的东西最重,现在身边有铁球和棉花,请问大家是放铁球进去好呢还是放棉花进去好呢?显而易见,放入铁球进去是最优选择。但是原因是什么呢?很简单,就是因为铁球的密度较大,相同体积的铁球和棉花相比,铁球更重。   不过前提是放入第一个铁球时,铁球的体积V1小于等于100m3 ;放入第二个铁球时,铁球的体积V2 小于等于(100-V1)m3;……;放入第n个铁球时,铁球的体积小于等于(100- ∑n1Vn-1

贪心法

不羁的心 提交于 2020-03-19 22:36:46
1.单源最短路径问题 #include<stdio.h> #include<iostream> #include<cmath> using namespace std; #define M 1000 int Cost[20][20]; int n; int Distance[20]; bool s[20]; int pr[20]; int source; void Dijkstra() { int i, j; //初始化 for(i=1; i<=n; i++) { Distance[i] = Cost[source][i]; s[i] = false; if(Distance[i]==M) { pr[i]=0; } else { pr[i]=source; } } Distance[source] = 0; s[source] = true; for(i=1; i < n; i++) {//每循环一次,求得一个最短路径 int temp=M; int u=source; for (j=1; j <= n; j++) //求离出发点最近的顶点 if((!s[j]) && Distance[j]<temp) { temp = Distance [j]; u = j; } s[u] =true; for(j=1; j<=n; j++) //修改递增路径序列(集合) { if((!s[j]

贪心算法(2)-Kruskal最小生成树

坚强是说给别人听的谎言 提交于 2020-03-19 09:08:21
什么是最小生成树? 生成树是相对图来说的,一个图的生成树是一个树并把图的所有顶点连接在一起。一个图可以有许多不同的生成树。一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。最小生成树其实是 最小权重生成树 的简称。生成树的权重是考虑到了生成树的每条边的权重的总和。 最小生成树有几条边? 最小生成树有(V – 1)条边,其中V是给定的图的顶点数量。 Kruskal算法 下面是步骤寻找MST使用Kruskal算法 1 1,按照所有边的权重排序(从小到大) 2 3 2,选择最小的边。检查它是否形成与当前生成树形成环。如果没有形成环,讲这条边加入生成树。否则,丢弃它。 4 5 3,重复第2步,直到有生成树(V-1)条边 步骤2使用 并查集算法 来检测环。如果不熟悉并查集建议阅读下 并查集 。 该算法是一种贪心算法。贪心的选择是选择最小的权重的边,并不会和当前的生成树形成环。让我们了解一个例子,考虑下面输入图 spanning-tree-mst 该图包含9个顶点和14个边。因此,形成最小生成树将有(9 – 1)= 8条边。 01 排序后: 02 Weight Src Dest 03 1 7 6 04 2 8 2 05 2 6 5 06 4 0 1 07 4 2 5 08 6 8 6 09 7 2 3 10 7 7 8 11 8

Dijkstra最短路径算法[贪心]

偶尔善良 提交于 2020-03-19 09:07:33
Dijkstra算法的标记和结构与prim算法的用法十分相似。它们两者都会从余下顶点的优先队列中选择下一个顶点来构造一颗扩展树。但千万不要把它们混淆了。它们解决的是不同的问题,因此,所操作的优先级也是以不同的方式计算的:Dijkstra算法比较路径的长度,因此必须把边的权重相加,而prim算法则直接比较给定的权重。 源最短路径问题 给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数。另外,还给定 V 中的一个顶点,称为源。现在我们要计算从源到所有其他各顶点的最短路径长度。这里的长度是指路上各边权之和。这个问题通常称为单源最短路径问题。 前面 Bellman-Ford最短路径算法 讲了单源最短路径的Bellman-Ford算法(动态规划算法)。这里介绍另外一个更常见的算法Dijkstra算法。 Dijkstra算法和 最小生成树Prim算法 最小生成树算法非常类似,大家可以先熟悉下个算法。两个算法都是基于贪心算法。虽然Dijkstra算法相对来说比Bellman-Ford 算法更快,但是不适用于有负权值边的图,贪心算法决定了它的目光短浅。而Bellman-Ford 算法从全局考虑,可以检测到有负权值的回路。 这里模仿MST(Minimum Spanning Tree)的Prim算法,我们创建一个SPT(最短路径树),最初只包含源点。我们维护两个集合

贪心总结

孤者浪人 提交于 2020-03-17 07:43:03
这个周学习了贪心算法,下面总结一下这周贪心的学习。 什么是贪心算法 贪心算法指的是解最优化问题的一种特殊方法,解决过程中总是做出当下最好的选择,因为具有最优子结构的特点,局部最优解可以得到全局最优解;这种贪心算法是动态规划的一种特例。能用贪心解决的问题,也可以用动态规划解决。贪心算法,就是找到找到一种方法找到解决一种事情的最优办法。 下面通过一个例题,整理一下贪心算法的运用。 分糖果 题目:已知一些孩子和一些糖果,每个孩子有需求因子g,每个糖果有大小s,当某个糖果的大小s>=某个孩子的需求因子g时,代表该糖果可以满足该孩子,求使用这些糖果,最多能满足多少孩子(注意,某个孩子最多只能用1个糖果满足) #include #include class Solution { public: Solution(){} ~Solution(){} int findContentChildren(std::vector& g, std::vector& s) { std::sort(g.begin(), g.end()); std::sort(s.begin(), s. end()); unsigned int child = 0; unsigned int cookie = 0; while (child<g.size() && cookie<s.size()) { if (g[child]

[贪心/二分] Exercise Week4 A+B+C题

≯℡__Kan透↙ 提交于 2020-03-17 01:56:22
目录 A.ddl的恐惧(贪心) 题意 样例 思路 总结 代码 B.四个数列(二分) 题意 样例 思路 总结 代码 C.TT的神秘礼物 题意 样例 思路 总结 代码 A.ddl的恐惧(贪心) 题意 有n([1,1000])个作业,每个左右有相应的ddl,如果未在ddl之前做完作业,将会扣除一定的分数(每个作业消耗相同的一个单位时间) 求最少会被扣除多少分数 样例 样例输入: 第一行一个数字T 代表数据组数 每一组样例的第一行数字 n 代表作业数量 下一行n个数字ai 代表第i个作业的ddl 再下一行n个数字bi 代表第i个作业的分值 3 3 3 3 3 10 5 1 3 1 3 1 6 2 3 7 1 4 6 4 2 4 3 3 2 1 7 6 5 4 样例输出: 一组数据输出一个答案ans 表示最少被扣掉的分数 单独占一行 0 3 5 思路 1.将每个任务按照ddl的大小降序排列,即ddl大的在前面 2.将时间t初始化为最大的ddl(t再大也没用,因为没有作业需要做) 从后向前遍历时间t 3.在每个时间t里,从k(初始化为1)到n遍历task数组,将其中的score值放入到大根堆中 直到task[i]的ddl不等于t 并且弹出大根堆的堆顶元素 并使 t-- 代表时刻t完成了分值为q.top()的任务(注意for循环中k每次也要自加 因为k是每一次遍历task数组的起始下标) 4

动态规划、回溯、贪心,分治

帅比萌擦擦* 提交于 2020-03-17 01:24:09
某厂面试归来,发现自己落伍了!>>> 动态规划篇 从斐波那契数列开始 我们先给出斐波那契数列的常用算法类 public class Fibonacci { private static int num = 0 ; private Fibonacci () { } public static int fib ( int n) { num ++ ; if (n == 0 ) { return 0 ; } if (n == 1 ) { return 1 ; } return fib (n - 1 ) + fib (n - 2 ) ; } public static void main (String[] args) { num = 0 ; int n = 20 ; long start = System. nanoTime () ; int res = Fibonacci. fib (n) ; long end = System. nanoTime () ; System. out .println(res) ; System. out .println((end - start) / 1000000000.0 ) ; System. out .println( num ) ; } } 运行结果 6765 3.96599E-4 21891 此时我们调大n的值为40 运行结果

DDL问题-贪心算法

懵懂的女人 提交于 2020-03-16 21:53:35
题目 题目大意 本题给出了若干个任务的DDL和对应的分值,要求得出最少扣分值,也就是求出最大得分。在DDL前完成任务可以得分,否则就不能。 解题思路 本题与区间覆盖问题有一些相似之处,因此在贪心准则的选取时有一定参考。首先可以将所有任务按DDL进行排序,随后开始由最后一天即最大DDL开始向前选取。此时可以使用优先队列,将DDL在所选日期之后的项目放入队列,然后弹出分值最大的项目,表明该项得分。一直搜索到第一天结束,用总分数减去已完成的分数可以得出扣去的分数。 具体代码 # include <iostream> # include <cstring> # include <cstdio> # include <string> # include <algorithm> # include <cmath> # include <cstdlib> # include <ctime> # include <iomanip> # include <vector> # include <queue> # define ll long long # define ld long double using namespace std ; struct node { int ddl ; int grade ; int flag ; bool operator < ( const node & x )

程序竞赛SDAU--贪心算法(第三周)

瘦欲@ 提交于 2020-03-16 17:51:30
一 ① 假设一个箱子能放下4个 苹果,我有n个苹果需要几个箱子? 总的箱子数:(n+4-1)/4; ②下面的这个题中 还有一个 利用求余数来判断能放几个别的类型 例题:一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为1 1, 2 2, 3 3, 4 4, 5 5, 6 6。这些产品通常使用一个 6 6 h 的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。现在这个程序由你来设计。 输入 输入文件包括几行,每一行代表一个订单。每个订单里的一行包括六个整数,中间用空格隔开,分别为1 1至6 6这六种产品的数量。输入文件将以6个0组成的一行结尾。 输出 除了输入的最后一行6个0以外,输入文件里每一行对应着输出文件的一行,每一行输出一个整数代表对应的订单所需的最小包裹数。 样例输入 0 0 4 0 0 1 7 5 1 0 0 0 0 0 0 0 0 0 样例输出 2 1 原始思路过程: 刚开始的时候我的代码很长,我想的一个箱子放a6不剩空间 放a5剩下11个空 放a4剩下 20个空 这个能放 20个1 1或者5个1 1 放a3 情况就多了 放一个 的时候 剩 5个2 2 或者20个空 放两个剩3个2 2或者12空 放三个 剩1个2