贪心算法(1)
贪心算法-01背包问题

贪⼼算法-01背包问题1、问题描述:给定n种物品和⼀背包。
物品i的重量是wi,其价值为vi,背包的容量为C。
问:应如何选择装⼊背包的物品,使得装⼊背包中物品的总价值最⼤?形式化描述:给定c >0, wi >0, vi >0 , 1≤i≤n.要求找⼀n元向量(x1,x2,…,xn,), xi∈{0,1}, ∋ ∑ wi xi≤c,且∑ vi xi达最⼤.即⼀个特殊的整数规划问题。
2、最优性原理:设(y1,y2,…,yn)是 (3.4.1)的⼀个最优解.则(y2,…,yn)是下⾯相应⼦问题的⼀个最优解:证明:使⽤反证法。
若不然,设(z2,z3,…,zn)是上述⼦问题的⼀个最优解,⽽(y2,y3,…,yn)不是它的最优解。
显然有∑vizi > ∑viyi (i=2,…,n)且 w1y1+ ∑wizi<= c因此 v1y1+ ∑vizi (i=2,…,n) > ∑ viyi, (i=1,…,n)说明(y1,z2, z3,…,zn)是(3.4.1)0-1背包问题的⼀个更优解,导出(y1,y2,…,yn)不是背包问题的最优解,⽭盾。
3、递推关系:设所给0-1背包问题的⼦问题的最优值为m(i,j),即m(i,j)是背包容量为j,可选择物品为i,i+1,…,n时0-1背包问题的最优值。
由0-1背包问题的最优⼦结构性质,可以建⽴计算m(i,j)的递归式:注:(3.4.3)式此时背包容量为j,可选择物品为i。
此时在对xi作出决策之后,问题处于两种状态之⼀:(1)背包剩余容量是j,没产⽣任何效益;(2)剩余容量j-wi,效益值增长了vi ;使⽤递归C++代码如下:#include<iostream>using namespace std;const int N=3;const int W=50;int weights[N+1]={0,10,20,30};int values[N+1]={0,60,100,120};int V[N+1][W+1]={0};int knapsack(int i,int j){int value;if(V[i][j]<0){if(j<weights[i]){value=knapsack(i-1,j);}else{value=max(knapsack(i-1,j),values[i]+knapsack(i-1,j-weights[i]));}V[i][j]=value;}return V[i][j];}int main(){int i,j;for(i=1;i<=N;i++)for(j=1;j<=W;j++)V[i][j]=-1;cout<<knapsack(3,50)<<endl;cout<<endl;}不使⽤递归的C++代码:简单⼀点的修改//3d10-1 动态规划背包问题#include <iostream>using namespace std;const int N = 4;void Knapsack(int v[],int w[],int c,int n,int m[][10]);void Traceback(int m[][10],int w[],int c,int n,int x[]);int main(){int c=8;int v[]={0,2,1,4,3},w[]={0,1,4,2,3};//下标从1开始int x[N+1];int m[10][10];cout<<"待装物品重量分别为:"<<endl;for(int i=1; i<=N; i++){cout<<w[i]<<" ";}cout<<endl;cout<<"待装物品价值分别为:"<<endl;for(int i=1; i<=N; i++){cout<<v[i]<<" ";}cout<<endl;Knapsack(v,w,c,N,m);cout<<"背包能装的最⼤价值为:"<<m[1][c]<<endl;Traceback(m,w,c,N,x);cout<<"背包装下的物品编号为:"<<endl;for(int i=1; i<=N; i++){if(x[i]==1){cout<<i<<" ";}}cout<<endl;return 0;}void Knapsack(int v[],int w[],int c,int n,int m[][10]){int jMax = min(w[n]-1,c);//背包剩余容量上限范围[0~w[n]-1] for(int j=0; j<=jMax;j++){m[n][j]=0;}for(int j=w[n]; j<=c; j++)//限制范围[w[n]~c]{m[n][j] = v[n];}for(int i=n-1; i>1; i--){jMax = min(w[i]-1,c);for(int j=0; j<=jMax; j++)//背包不同剩余容量j<=jMax<c{m[i][j] = m[i+1][j];//没产⽣任何效益}for(int j=w[i]; j<=c; j++) //背包不同剩余容量j-wi >c{m[i][j] = max(m[i+1][j],m[i+1][j-w[i]]+v[i]);//效益值增长vi }}m[1][c] = m[2][c];if(c>=w[1]){m[1][c] = max(m[1][c],m[2][c-w[1]]+v[1]);}}//x[]数组存储对应物品0-1向量,0不装⼊背包,1表⽰装⼊背包void Traceback(int m[][10],int w[],int c,int n,int x[]){for(int i=1; i<n; i++){if(m[i][c] == m[i+1][c]){x[i]=0;}else{x[i]=1;c-=w[i];}}x[n]=(m[n][c])?1:0;}运⾏结果:算法执⾏过程对m[][]填表及Traceback回溯过程如图所⽰:从m(i,j)的递归式容易看出,算法Knapsack需要O(nc)计算时间; Traceback需O(n)计算时间;算法总体需要O(nc)计算时间。
五大常用算法(一)贪心算法

五⼤常⽤算法(⼀)贪⼼算法⼀、基本概念 所谓贪⼼算法是指,在对问题求解时,总是做出在当前来看是最好的选择。
也就是说,不从整体最优上加以考虑,通过贪⼼算法做出来的往往是在把原问题拆分成⼏个⼩问题,分别求每个⼩问题的最优解,再把这些“局部最优解”叠起来,就作为整个问题当前的最优解。
贪⼼算法⽆固定的算法框架,算法设计的关键是贪⼼策略的选择,必须注意的是,贪⼼算法不是对所有问题都能得到整体最优解,选择贪⼼策略必须具备⽆后效性(即某个状态以后的过程不会影响以前的状态,只与当前状态有关)。
⽐如,求最⼩⽣成树的Prim算法和 Kruskal算法都是漂亮的贪⼼算法。
⼆、基本思路建⽴数学模型来描述问题;把求解的问题分成若⼲个⼦问题;对每个⼦问题求解,得到⼦问题的局部最优解;把⼦问题的局部最优解合成原来问题的⼀个解。
三、存在的问题不能保证求得的最后解是最佳的;不能⽤来求最值的问题;只能求满⾜某些约束条件的可⾏解的范围。
四、例题分析 【背包问题】有⼀个背包,容量是M=150,有7个物品,物品可以分割成任意⼤⼩。
要求尽可能让装⼊背包中的物品总价值最⼤,但不能超过总容量。
物品:A B C D E F G 重量:35 30 60 50 40 10 25 价值:10 40 30 50 35 40 30 题⽬分析:为了使背包总价值最⼤,我们可以制定三种策略:1. 每次挑选价值最⼤的物品装⼊背包;2. 每次挑选重量最⼩的物品装⼊背包;3. 每次挑选单位重量价值最⼤的物品装⼊背包; 策略 1 结果:选择 D B F E 总重量 130 总价值 165; 策略 2 结果:选择 F G B A E 总重量 140 总价值 155; 策略 3 结果:选择 F B G D A 总重量 150 总价值 170; 结果分析:可以看到单位重量价值最⼤的策略的结果⽐其它更好。
总结:由此可见,策略制定的不同,得到的解也会不同,我们只需要针对不同的问题制定不同的策略即可。
背包问题解析(一)-贪心算法

背包问题解析(⼀)-贪⼼算法⼀、题⽬:有N件物品和⼀个容量为V的背包。
第i件物品的重量是w[i],价值是v[i]。
求解将哪些物品装⼊背包可使这些物品的重量总和不超过背包容量,且价值总和最⼤。
⼆、解决思路:本题刚开始的解题的时候,想采取贪⼼算法来解决,也就是将放⼊的物品的性价⽐按照从⾼到低进⾏排序,然后优先放优先级⾼的,其次优先级低的。
三、代码实现(python)1# 重量w=[5,4,3,2]2# 价值v=[6,5,4,3]3 b=[]4 m=int(input("请输⼊背包的最⼤重量:"))5 n=int(input("请输⼊商品的数量:"))6for i in range(n):7 a=input("请分别输⼊重量和价值,以空格隔开:")8 a=a.split("")9for i in range(len(a)):10 a[i]=int(a[i])11 b.append(a)12print("加载初始化:",b)13for i in range(len(b)):14for j in range(i+1,len(b)):15if b[i][1]/b[i][0]<b[j][1]/b[j][0]:16 b[i],b[j]=b[j],b[i]17print("性价⽐排序:",b)18 v=019 c=[]20for i in range(len(b)):21if m-b[i][0]>0:22 m=m-b[i][0]23 c.append(b[i])24 v+=b[i][1]25print("放⼊背包:",c)26print("最⼤价值为:",v)打印结果:四、算法分析:贪⼼选择是指所求问题的整体最优解可以通过⼀系列局部最优的选择,即贪⼼选择来达到。
贪心算法的基本原理

贪心算法的基本原理贪心算法(Greedy Algorithm)是一种常用的算法思想,它在求解最优化问题时通常能够得到较好的近似解。
贪心算法的基本原理是:每一步都选择当前状态下的最优解,从而希望最终能够得到全局最优解。
在实际应用中,贪心算法常常用于解决一些最优化问题,如最小生成树、最短路径、任务调度等。
一、贪心算法的特点贪心算法具有以下特点:1. 简单:贪心算法通常比较简单,易于实现和理解。
2. 高效:贪心算法的时间复杂度通常较低,能够在较短的时间内得到结果。
3. 局部最优:每一步都选择当前状态下的最优解,但不能保证最终能够得到全局最优解。
4. 适用范围:贪心算法适用于一些特定类型的问题,如无后效性、最优子结构等。
二、贪心算法的基本原理贪心算法的基本原理可以概括为以下几个步骤:1. 初始状态:确定问题的初始状态,定义问题的输入和输出。
2. 状态转移:根据当前状态,选择局部最优解,并更新状态。
3. 筛选解:判断当前状态下是否满足问题的约束条件,若满足则保留该解,否则舍弃。
4. 终止条件:重复以上步骤,直至满足终止条件,得到最终解。
三、贪心算法的应用举例1. 找零钱:假设有 25、10、5、1 四种面额的硬币,需要找零 41 元,如何使得找零的硬币数量最少?贪心算法可以先选择面额最大的硬币,然后逐步选择面额较小的硬币,直至找零完毕。
2. 区间调度:给定一组区间,如何选择最多的互不重叠的区间?贪心算法可以先按照区间的结束时间排序,然后依次选择结束时间最早的区间,直至所有区间都被覆盖。
3. 最小生成树:在一个连通的带权无向图中,如何选择边使得生成树的权值最小?贪心算法可以按照边的权值从小到大排序,然后依次选择权值最小且不构成环的边,直至所有顶点都被连接。
四、贪心算法的优缺点1. 优点:贪心算法简单高效,适用于一些特定类型的问题,能够在较短的时间内得到近似最优解。
2. 缺点:贪心算法不能保证一定能够得到全局最优解,可能会出现局部最优解不是全局最优解的情况。
第4章 贪心算法(1)活动安排问题

4.1 活动安排问题
活动安排问题是可以用贪心算法有效求解的很 好例子。
该问题要求高效地安排一系列争用某一公共资 源的活动,使得尽可能多的活动能兼容地使用 公共资源。
4
问题描述
设有n个活动的集合E={1, 2, …, n},其中每个 活动都要求使用同一资源,而在同一时间内只 有一个活动能使用这一资源。
2
贪心算法
例2:若上述硬币面值改为:
一角一分、五分和一分 现在要找给顾客一角五分钱,如何给出硬币? 答案:错:1个一角一分,4个一分
对:3个五分
虽然贪心算法不能对所有问题都得到整体最优 解,但对许多问题它能产生整体最优解。
在一些情况下,即使贪心算法不能得到整体最 优解,其最终结果却是最优解的很好的近似解。
ቤተ መጻሕፍቲ ባይዱ17
0-1背包问题
给定n种物品和一个背包。物品i的重量是wi, 其价值为vi,背包的容量为c。应如何选择装 入背包的物品,使得装入背包中物品的总价 值最大?
说明:在选择装入背包的物品时,对每种物 品i只有2种选择,即装入背包或不装入背包。 不能将物品i装入背包多次,也不能只装入部 分的物品i。
16
3、贪心算法与动态规划算法的 差异
贪心算法和动态规划算法都要求问题具有最 优子结构性质,这是两类算法的一个共同点。
对于具有最优子结构的问题应该选用贪心算 法还是动态规划算法求解?
是否能用动态规划算法求解的问题也能用贪 心算法求解?
下面研究2个经典的组合优化问题,并以此 说明贪心算法与动态规划算法的主要差别。
每个活动i都有一个要求使用该资源的起始时 间si和一个结束时间fi,且si <fi 。
5
问题描述
如果选择了活动i,则它在半开时间区间[si, fi) 内占用资源。若区间[si, fi)与区间[sj, fj)不相交, 则称活动i与活动j是相容的。也就是说,当si≥fj
贪心算法知识点总结

贪心算法知识点总结1. 基本原理贪心算法的基本原理是每一步都选择当前状态下的最优解,以期望最终得到全局最优解。
具体来说,贪心算法通常可以分为以下几个步骤:1)从问题的某个初始解出发2)采用一种迭代的方式,逐步将初始解进行优化3)每一步都是基于当前状态的最优选择来进行优化4)直到无法再进行优化,得到问题的最优解由于贪心算法每一步都要选择局部最优解,因此贪心算法通常具有高效性。
然而,贪心算法并不适用于所有问题,其结果不一定是全局最优解。
因此,在使用贪心算法时需要注意问题的特性和约束条件,以免得到错误的结果。
2. 适用情况贪心算法通常适用于满足以下条件的问题:1)问题的最优解满足“最优子结构”性质:即问题的最优解包含了其子问题的最优解2)问题的求解过程具有“贪心选择性”:即每一步都选择当前状态下的最优解,并不需要考虑未来的后果3)问题的约束条件可以通过局部最优选择满足全局最优解:即问题的解空间中存在一些局部最优解,可以通过一系列的局部最优解构建全局最优解在实际应用中,贪心算法通常用于求解最优化问题,如最小生成树、最短路径、任务调度等问题。
由于贪心算法的高效性,它通常能够在较短的时间内得到较为接近最优解的结果。
然而,贪心算法并不适用于所有问题,对于一些问题,贪心算法将得到错误的结果。
因此,在使用贪心算法时需要谨慎选择问题类型和约束条件,以避免错误的结果。
3. 贪心算法实例在下面的部分,我们将介绍一些常见的贪心算法实例,包括背包问题、活动安排问题、霍夫曼编码等。
3.1 背包问题背包问题是一个经典的优化问题,它包括0-1背包问题、分数背包问题等多种类型。
在0-1背包问题中,给定n种物品和一个容量为C的背包,每种物品i的重量为w[i],价值为v[i],求在不超过背包容量的情况下,如何选择物品放入背包,可以使得背包中的总价值最大。
对于0-1背包问题,贪心算法通常不能得到最优解。
然而,在分数背包问题中,贪心算法通常可以得到近似的最优解。
《算法设计与分析》课程实验报告 (贪心算法(一))

《算法设计与分析》课程实验报告实验序号:07实验项目名称:实验8 贪心算法(一)一、实验题目1.删数问题问题描述:键盘输入一个高精度的正整数N(不超过250 位),去掉其中任意k个数字后剩下的数字按原左右次序将组成一个新的非负整数。
编程对给定的N 和k,寻找一种方案使得剩下的数字组成的新数最小。
若输出前有0则舍去2.区间覆盖问题问题描述:设x1,x2,...xn是实轴上的n个点。
用固定长度为k的闭区间覆盖n个点,至少需要多少个这样的固定长度的闭区间?请你设计一个有效的算法解决此问题。
3.会场安排问题问题描述:假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。
设计一个有效的贪心算法进行安排。
(这个问题实际上是著名的图着色问题。
若将每一个活动作为图的一个顶点,不相容活动间用边相连。
使相邻顶点着有不同颜色的最小着色数,相应于要找的最小会场数。
)4.导弹拦截问题问题描述:某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。
但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。
某天,雷达捕捉到敌国的导弹来袭。
由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
给定导弹依次飞来的高度(雷达给出的高度数据是≤50000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
二、实验目的(1)通过实现算法,进一步体会具体问题中的贪心选择性质,从而加强对贪心算法找最优解步骤的理解。
(2)掌握通过迭代求最优的程序实现技巧。
(3)体会将具体问题的原始数据预处理后(特别是以某种次序排序后),常能用贪心求最优解的解决问题方法。
三、实验要求(1)写出题1的最优子结构性质、贪心选择性质及相应的子问题。
(2)给出题1的贪心选择性质的证明。
(3)(选做题):写出你的算法的贪心选择性质及相应的子问题,并描述算法思想。
贪心算法的概念和适用条件

贪心算法的概念和适用条件什么是贪心算法?贪心算法(Greedy Algorithm)是一种以局部最优解为导向的算法思想,通过每一步选择当前状态下的最佳操作来达到整体最优解的目标。
贪心算法的核心思想是每次都做出当前看来最优的选择,以期望能够达到整体的最优解。
贪心算法通常用于一些问题中,即每一步的选择只依赖于当前状态,而不考虑将来可能出现的情况。
贪心算法的适用条件:1. 贪心选择性质:贪心算法每一步都选择一个当前的最优解,此处的“最优”指的是局部最优。
这种最优选择可以确保问题能够被拆解,并且进行下一步求解。
2. 最优子结构性质:当问题的整体最优解能够通过局部最优解得到时,可以采用贪心算法求解。
这种情况下,问题的最优解可以由子问题的最优解推导出来。
3. 无后效性:贪心算法选择某一步操作时,只考虑当前状态,不会改变以前的操作,并且不关心未来的操作。
这种无后效性使得贪心算法在实际应用中操作简单、效率高。
贪心算法的基本步骤:1. 确定问题的局部最优解:贪心算法的核心是每一步都选择在当前情况下的最优解。
因此,需要确定问题如何拆解以及如何进行局部最优选择。
2. 定义问题的子问题:根据问题的最优子结构性质,将问题拆解为较小规模的子问题。
子问题应该是原问题的一个更小、更简单的实例。
3. 定义贪心选择策略:根据问题的特性,确定当前步骤下的最优选择策略。
这个选择应该是局部最优的,可以在不考虑子问题和整体未来状态的情况下得出。
4. 重复执行步骤2和3,直至求解出全局最优解。
贪心算法的优缺点:贪心算法具有简单易懂、快速高效的特点,适用于许多实际问题。
它可以避免穷举所有可能性,节省了计算时间。
此外,贪心算法常常能够找到近似最优解,尽管不一定能够保证全局最优解。
在实际问题中,近似最优解也往往可以满足实际需求。
然而,贪心算法并非适用于所有问题。
由于贪心算法只考虑当前状态的最优选择,而不考虑未来的影响,因此可能会导致局部最优解与全局最优解不一致。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
分析
分析
பைடு நூலகம்
例题4:均分纸牌 (NOIP2002)
有N堆纸牌,编号分别为 1,2,…,N。每堆上有若干张, 但纸牌总数必为N的倍数。可以在任一堆上取若于张纸牌, 然后移动。
• 但并不是所有具有最优子结构的问题都可以用贪心策 略求解。因为贪心往往是盲目的,需要使用更理性的 方法——动态规划(例如“0-1背包问题”与“部分背 包问题”)
【问题1】部分背包问题
• 给定一个最大载重量为M的卡车和N种食品,有食盐,白 糖,大米等。已知第i种食品的最多拥有Wi公斤,其商品 价值为Vi元/公斤,编程确定一个装货方案,使得装入卡 车中的所有物品总价值最大。
• 【样例输入】 178543 1829 1 4
• 【样例输出】13
分析
• 由于正整数n的有效位数最大可达240位,所以可以采用 字符串类型来存储n。那么,应如何来确定该删除哪s位呢? 是不是只要删掉最大的s个数字就可以了呢?
• 为了尽可能地逼近目标,我们选取的贪心策略为:每一步 总是选择一个使剩下的数最小的数字删去,即按高位到低 位的顺序搜索,若各位数字递增,则删除最后一个数字, 否则删除第一个递减区间的首字符。然后回到串首,按上 述规则再删除下一个数字。重复以上过程s次,剩下的数 字串便是问题的解了。
移牌规则为:在编号为1堆上取的纸牌,只能移到编号 为2的堆上;在编号为N的堆上取的纸牌,只能移到编号为 N-1的堆上;其他堆上取的纸牌,可以移到相邻左边或右边 的堆上。
现在要求找出一种移动方法,用最少的移动次数使每堆 上纸牌数都一样多。
• 我们以2×3的矩阵为例:
若按贪心策略求解,所得路径为:1→3→4→6; 若按动态规划求解,所得路径为:1→2→10→6。
贪心法的特点
• 1.贪心选择性质:算法中每一步选择都是当前看似最 佳的选择,这种选择依赖于已做出的选择,但不依赖 于未做的选择。
• 2.最优子结构性质:算法中每一次都取得了最优解(即 局部最优解),要保证最后的结果最优,则必须满足全 局最优解包含局部最优解。
【分析】按贪心法:每次选价格最大的装载。很明显有反例: 设N=3,卡车最大载重量是100,三种动物A、B、C的重量分别 是40,50,70,其对应的总价值分别是80、100、150。
贪心策略与其他算法的区 别
• 1.贪心与递推:与递推不同的是,贪心法中推进的每 一步不是依据某一固定的递推式,而是当前看似最佳 的贪心决策,不断的将问题归纳为更加小的相似的子 问题。所以归纳、分析、选择正确合适的贪心策略, 是正确解决贪心问题的关键。
问题推广:排队打水问题
• 有n个人排队到r个水龙头去打水,他们 装满水桶的时间t1、t2…….tn为整数且 各不相等,应如何安排他们的打水顺序 才能使他们总共花费的时间最少?
例题3:打包
• 某工厂生产出的产品都要被打包放入正四棱柱的盒子内, 所有盒子的高度为h,但地面尺寸不同,可以为 1x1、2x2、 3x3、4x4、5x5、6x6。如下图所示。
【分析】因为每一个物品都可以分割成单位块,单位块的利 益越大,显然总收益越大,所以它局部最优满足全局最优, 可以用贪心法解答。
方法如下:先将单位块收益按从大到小进行排列,然后 用循环从单位块收益最大的取起,直到不能取为止便得到了 最优解。
【问题2】0/1背包问题
• 给定一个最大载重量为M的卡车和N种动物。已知第i种动 物的重量为Wi,其最大价值为Vi,设定M,Wi,Vi均为 整数,编程确定一个装货方案,使得装入卡车中的所有动 物总价值最大。
• T1=1
• T2=T1+t2=1+3=4
• T3=T2+t3=4+5=9
• T4=T3+t4=9+7=16
• T5=T4+t5=16+9=25
• T6=T5+t6=25+11=36
• 总时间T=T1+T2+T3+T4+T5+T6=91
• 用反证法证明如下:假设一个不排好序的n个人也能得到最优答案,比如把 (1,3,5,7,9,11)中的3,5对调一下,得到的序列为(1,5,3,7,9,11)。对调后,3,5前 后的1,7,9,11四个人的买饭时间不会有变化,关键的变化是3,5两个人。这时,5 这个人的买饭时间为1+5,3这个人的买饭时间变为1+5+3,此时两个人的总买 饭时间中,5被累加了2次,而原方案中是3被累加了2次,其他一样。由此,两 者相比较,可知有序的序列能得到最优的方案。对于其他位置的改变可以采用 同样的方法证明。用反证法证明时,关键是证明反例不成立,由此推出原方案 是最优的。
贪心算法
贪心方法的基本思想
• 贪心是一种解题策略,也是一种解题思想 • 使用贪心方法需要注意局部最优与全局最优的
关系,选择当前状态的局部最优并不一定能推 导出问题的全局最优 • 利用贪心策略解题,需要解决两个问题: – 该题是否适合于用贪心策略求解 – 如何选择贪心标准,以得到问题的最优解
• 【引例】在一个N×M的方格阵中,每一格子赋予一个数 (即为权),规定每次移动时只能向上或向右。现试找出 一条路径,使其从左下角至右上角所经过的权之和最大。
例题2:排队问题
• 在一个食堂,有n个人排队买饭,每个人 买饭需要的时间为Ti,请你找出一种排 列次序,是每个人买饭的时间总和最小。
• 【思路点拨】由题意可知,本题可以采用的贪心策略为:将n个人排队买饭的 时间从小到大排序,再依次累加每人的买饭时间,即可得到最小的总和。由样 例可知,排好序后的数据为(1,3,5,7,9,11),每个人的买饭时间如下:
• 2.贪心与动态规划:与动态规划不同的是,贪心是 鼠目寸光;动态规划是统揽全局。
几个简单的贪心例子
贪心策略
例题1:删数问题
• 键盘输入一个高精度的正整数n(n<=240位), 去掉其中任意s个数字后剩下的数字按照原来 的次序将组成一个新的正整数。编程对给定的 n和s,寻求一种方案,使得剩下组成的新数最小。