数学模型_贪心算法及实例共38页
[数学]152 贪心算法ppt课件
35 53
Prim算法实现 int s[N]表示集合S,1表示曾经参与,否那么0
,初始S[0] = 1; lowcost[N]记录每一个顶点到集合s的最短边长
度,初始lowcost[0, ..., N-1] = c[0][0, ..., N-1] lowcost[N] ={0,4,INT_MAX, 5, INT_MAX,
就根据部分最优战略,得到一个部分解,减少 问题的范围或规模 选择最早终了的事件; 将一切的部分解综合列;
13 53
二:区间覆盖问题
问题的描画
用整数i来表示x轴上坐标为[i - 1, i]的区间(长度 为1)。给出M(1 <= M <= 200)个不同的整数, 表示M个这样的区间。
2 53
背包问题: 给定n种物品和一个背包,设Wi为物体i的分量
,Vi为期价值,C为背包的承分量。要求在背 包的承分量的限制下,进能够使背包中物品 的价值最大。 贪婪战略一:每次选择价值最大的物品。 贪婪战略二:每次选择分量最小的物品。 贪婪战略三:每次选择Vi/Wi最大的物品
3 53
什么是贪婪法? “鼠目寸光〞的方法?每次选择面值最大的硬币
10 53
#include <iostream> using namespace std; const int N = 12; void OutputResult(int select[], int N) //输出结果函数 {
for(int i = 0; i < N; i++) {
if(select[i] == 1) //当标志为1时该事件被选中 cout << i << endl; } }
贪心算法PPT学习课件
5
例8.2 一个买糖的孩子用1元钱买了不到1元钱的糖,售货 员找硬币时希望用最少个数的硬币。 售货员每增加一个硬币,使用的贪心规则是: 每次希望增加尽可能多的币值,又不能超出总数。 例如要找66c(分)。
● 假设硬币面值分别为:25c, 10c, 5c, 1c。
● 假设硬币面值分别为:20c, 16c, 10c, 1c。
3. MAKESET({v})
4. End for
5. T={}
6. While |T|<n-1
7. 令(x,y)为E中的下一条边
8. If FIND(x)≠FIND(y) then
heyichao@
26
9.
将(x,y)加入T
10.
UNION(x,y)
11. End if
12. End while
● 函数H-1(w)返回w在H中的位置 (注意堆由一个 数组H(1…n)来实现)。
heyichao@
18
● 运行时间主要取决于堆运算,这里共有n-1 个DELETEMIN运算,n-1个INSERT运算,最 多m-n+1个SIFTUP运算,每个堆运算用O(logn) 时间,得到总共需要O(mlogn)时间。
1. 对G的边以非降序权重排列。
2. 对于排序表中的每条边,如果现在把它放入T 不会形成回路的话,则把它加入到生成树T中;否 则将它丢弃。
见例8.3
heyichao@
24
Kruskal算法的实现
为有效地实现此算法,我们需要某种机制来检 测加入边后是否构成回路。为此需要确定一种数 据结构,让它在算法的每个时刻来表示森林,并 且在向T中添加边时动态检测是否有回路生成。
7
● 假设V={1,2,…,n}并且s=1。这个问题可以用一 种称为Dijkstra算法的贪心技术来解决。初始时, 将顶点分为两个集合X={1}和Y={2,3,…,n}。X包 含的顶点集合:从源点到这些顶点的距离已经确 定。
贪心算法(陈鹏)
— 20 —
江苏省青少年信息学奥林匹克竞赛委员会 | 版权所有
© Copyright JSOI 2010
JSOI2010江苏省青少年信息学奥林匹克集训队(夏令营)
2、贪心算法的特点
[贪心算法解题的一般步骤] 1、设计数据找规律 2、进行贪心猜想 3、正确性证明(严格证明和一般证明) ·严格证明:数学归纳和反证法 ·一般证明:列举反例 4、程序实现
— 12 —
江苏省青少年信息学奥林匹克竞赛委员会 | 版权所有
© Copyright JSOI 2010
JSOI201——纪念品分组(NOIP2007普及组)
[输入输出样例] 输入: 输出: 100 6 9 90 20 20 30 50 60 70 80 90
若无法证明, 此步骤可缺省
— 21 —
江苏省青少年信息学奥林匹克竞赛委员会 | 版权所有
© Copyright JSOI 2010
JSOI2010江苏省青少年信息学奥林匹克集训队(夏令营)
2、贪心算法的特点
[典型的贪心算法简介] 贪心策略在树和图论中有着极其重要的应用,Prim、 Kruskal、Huffman等体现“贪心”思想的算法更是广泛地 应用于树与图的处理。 下面介绍一种利用“贪心”思想的算法——哈夫曼 (Huffman)树。
—7—
江苏省青少年信息学奥林匹克竞赛委员会 | 版权所有
© Copyright JSOI 2010
JSOI2010江苏省青少年信息学奥林匹克集训队(夏令营)
1、贪心概念
[求解这类问题的方法] 1、搜索 最原始的方法是搜索(穷举)法。当然,为了尽快搜 索出解,我们往往会利用限制条件进行可行性判断剪枝, 或利用目标函数的上界(或下界)进行分枝定界。 2、动态规划 第二种解决此类问题的方法是动态规划。当然,使用 动态规划必须要满足一些条件,如无后效性和最优子结构 等等。
贪心算法的应用实例
例 2.排队问题 【题目描述】 在一个医院 B 超室,有 n 个人要做不同身体部位的 B 超,已知每个人需要处理的时间 为 ti, (0<i<=n),请求出一种排列次序,使每个人排队等候时间总和最小。 输入数据:第 1 行一个正整数 n(你<=10000》 ,第 2 行有 n 个不超过 1000 的正整数 ti. 输出要求:n 个人排队时间最小总和。 输入输出样例 输入:4 5 10 8 7 输出: 67 【算法分析】 本题贪心算法:n 个人时间从小到大排序,就是这 n 个人最佳排队方案。求部分和的和 即为所求。 反证法证明:假设有最优解序列:s1,s2…sn,如 s1 不是最小的 Tmin,不妨设 sk=Tmin, 将 s1 与 sk 对调,显然,对 sk 之后的人无影响,对 sk 之前的人等待都减少了,()>0, 从而新的序列比原最优序列好,这与假设矛盾,故 s1 为最小时间,同理可证 s2…sn 依次最 小。
4
一个 v1;然后将 v1 上的另一条边 e2 分配给 e2 的另一个端点 v2;将 v2 上的另一条边 e3 分配给 e3 的另一个端点 v3; ……如此重复直到将 en 分配给 vn, 即图中所有的边都已分配, 结束算法。 6、将图中权最小的边不分配而直接删去。如果此时图仍然连通,则转 2;否则对这个图的 两个连通分量分别执行本算法。
在任意两个城市之间,这样的交易只能进行一次。因为你第二次贩运你的商品时,人们 对它们就不会感兴趣了。 现在你只身来到这个大陆上, 用有限的资金在每个城市中购买了一支商队。 你需要想办 法让你的这 N 支商队给你带来最大的经济收益。
3
任务说明 给出这个大陆的地图和每两个城市之间的贸易值 (如果这两个城市之间有路可通的话) , 你需要指挥你的 N 支商队进行一次经商,使得这 N 支商队在这次经商中获得的总收益最大。 注意: 你的每支商队只能进行一次交易, 即它们只能从它们所在的城市到达一个相邻的城市。 当然,它们也可以不进行任何交易。 输入数据 输入文件的第一行有两个整数 N(1 N 100) 、M(M 0) ,分别表示这个大陆上的 城市数和道路数。 接下来有 M 行,每行包括三个整数 i、j(1 i,j N 且 i j) 、v(1 V 10000), 表示一条道路的信息。其中 i 和 j 表示这条路在城市 i 和城市 j 之间,v 表示沿着这条路进 行一次交易所得的收益。i 和 j 的顺序是无关的,并且任意两个城市之间最多存在一条路。 输出数据 你的输出文件应该 2 行, 第 1 行包含 N 个整数。 其中第 k 个整数表示你在城市 k 中的商 队将要前往哪个城市进行交易(如果这支商队进行交易的话)或者为 0(如果这支商队不进 行任何交易) 。第 2 行输出最大收益值。 输入输出样例 input.in 4 1 1 2 2 3 5 2 3 3 4 4 40 30 50 30 20 output.out 2 3 1 2 150 样例图示
《贪心算法》PPT课件
{x1,x2,x3} {1,2/15,0} { 0,2/3,1} {0,1,1/2} {...}
n
wixi
20
i1
n
vixi
i1
20
20
...
31
...
[算法思路]1).将各物体按单位价值由高到低排序. 2).取价值最高者放入背包. 3).计算背包剩余空间. 4).在剩余物体中取价值最高者放入背包. 若背包剩余容量=0或物体全部装入背包为止
这种策略下的量度是已装入物品的累计效益值与所用 容量之比。
(v2/w2 , v3/w3 , v1/w1 )=(24/15,15/10, 25/18) 先装入重量为15的物品2,在装入重量为5的物品3, ∑pixi =24+15*5/10=31.5。此结果为最优解。
算法设计与分析 > 贪心算法
[例] n=3,c=20 (v1,v2,v3)=(25,24,15),(w1,w2,w3)=(18,15,10)
[常见应用]背包问题,最小生成树,最短路径,作业调度等等 [算法优点]求解速度快,时间复杂性有较低的阶. [算法缺点]需证明是最优解.
[适用问题] 具备贪心选择和最优子结构性质的最优化问题 贪心选择性质:整体的最优解可通过一系列局部最优解达到,即
贪心选择到达。
贪心算法通常以自顶向下的方式进行,以迭代的方式作出相
精选ppt13最优化描述找一个n元向量x44背包问题knapsackproblemmax问题描述设有n个物体和一个背包物体i的重量为w1装入背包则具有价值为v目标是找到一个方案使放入背包的物体总价值最高贪心算法精选ppt141652425121502028202312031011220315算法设计与分析贪心算法精选ppt151用贪心策略求解背包问题时首先要选出最优的度量标准
贪心算法的经典例子
标签: 贪心 算法 背包问题 it 分类: 简单算法
一、定义
什么是贪心算法呢?所谓贪心算法是指,在对问题求解时,总是做出在当前看来最好的选择。也就是说,不从整体最优解出发来考虑,它所做出的仅是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题都能产生整体最优解或整体最优解的近似解。
array.add(scanner.nextInt());
}
for(int i = 0; i < array.size(); i ++){
avg += array.get(i);
}
avg = avg/array.size();
System.out.println(array.size());
二是确定了可以用贪心算法之后,如何选择一个贪心标准,才能保证得到问题的最优解。在选择贪心标准时,我们要对所选的贪心标准进行验证才能使用,不要被表面上看似正确的贪心标准所迷惑,如下面的例子。
[最大整数]设有n个正整数,将它们连接成一排,组成一个最大的多位整数。
例如:n=3时,3个整数13,312,343,连成的最大整数为34331213。
public static void main(String[] args) {
int n = 0, avg =0, s = 0;
Scanner scanner = new Scanner(System.in);
ArrayList<Integer> array = new ArrayList<Integer>();
算法课件(五)贪心算法
最大值。
• 贪心算法在每一步的决策中虽然没有完全顾忌到问题整体 优化,但在局部择优中是朝着整体优化的方向发展的。为 此,贪心算法首先要确定一个度量准则(称为贪心准则), 每一步都是按这个准则选取优化方案。
贪心算法抽象化控制流程
Greedy(A, n) // A[1:n]代表那个输入 1. solution={}; //解向量初始化为空集 2. for i to n do 3. x:=Select(A) 4. if Feasible(solution, x) then 5. solution:=Union(solution, x) 6. end if 7. End for 8. Return (solution)
• 据此,贪心准则应当是:在未安排的活动中挑选结束时间
最早的活动安排。 • 在贪心算法中,将各项活动的开始时间和结束时间分别用 两个数组s和f存储,并使得数组中元素的顺序按结束时间 非减序排列:f1≤ f2≤…≤ fn。
[算法思路]将n个活动按结束时间非减序排列,依次考虑活动i,
若i与已选择的活动相容,则添加此活动到相容活动子集. [例]设待安排的11个活动起止时间按结束时间的非减序排列
作业集E的子集称为相容的,如果其中的作业可以被安排
由一台机器完成。带限期单机作业安排问题就是要在所 给的作业集合中选出总效益值最大的相容子集。
例如:n=4,(p1,p2,p3,p4)={100,10,15,20},
(d1,d2,d3,d4)={2,1,2,1}
• 例子 设n=7, (p1, p2,… , pn)=(35,30,25,20,15,10,5), (d1, d2,… ,dn)=(4,2,4,3,4,8,3), • 算法GreedyJob的执行过程可描述如下: d1; d2, d1; d2, d1,d3; d2, d4, d1,d3; d2, d4, d1,d3, d6; 4 ; 2, 4 ; 2, 4, 4 ; 2, 3, 4, 4 ; 2, 3, 4, 4, 8;
贪心算法讲义
float p[1..n], w[1..n], x[1..n], M, rc;
integer i, n; x:= 0; // 将解向量初始化为零
//w[1..n],它们元素的排列 //顺序满p[i]/w[i]≥p[i+1]/w[i+1] //M是背包容量,x[1..n]是解向量
rc:= M; // 背包的剩余容量初始化为M
作业调度问题
单机作业调度问题的贪心算法
将上述算法找到的作业集按作业期限升序排列,就产生一 个作业调度。
算法的复杂度分析
J {i}的相容性判断最坏|J|次,|J|最大i-1。所以 T(n)=1+2+…+n-1=O(n2)
例子: 设n=7,
(p1, p2,… ,pn)=(35,30,25,20,15,10,5), (d1, d2,… ,dn)=(4,2,4,3,4,8,3) 算法GreedyJob的执行过程 : 作业 1 ;2, 1; 2, 1, 3; 2, 4, 1, 3; 2, 4, 1, 3 , 6; 期限 4; 2, 4; 2,4, 4; 2, 3, 4, 4; 2, 3, 4, 4, 8;
带期限的单机作业安排问题
已知n项作业 E={1, 2, … ,n}要求使用同台机器完成, 而且每项作业需要的时间都是1。第k项作业要求在时 刻2, d…k之, n前。完成, 而且完成这项作业将获得效益pk,k=1,
作业集E的子集称为相容的如果其中的作业可以被安 排由一台机器完成。
带限期单机作业安排问题就是要在所给的作业集合中 选出总效益值最大的相容子集。
许多NP难组合优化问题,目前仍未找到有效的算法, 贪心策略常用于设计这些问题的近似算法。
贪心算法的基本思想
贪心算法求解程序存储问题的数学模型
贪心算法求解程序存储问题的数学模型
通常,贪心算法是可以用来求解程序存储问题的数学模型。
程序存储问题是指在有限的存储空间中放置最多的程序。
假设有一个存储空间大小为N,要存储的程序有n个,每个程序占用存储空间的大小为 si(i=1,2……,n)。
我们可以建立一个数学模型来求解程序存储问题,即:
最大化∑si
且∑si≤N
其中si ≥ 0, i = 1, 2, …, n。
为了求解上述的数学模型,我们可以采用贪心算法,其思想是:从n个程序中依次取出,使存储空间剩余的空间最小,同时它的大小不超过N。
算法过程如下:
①从n个程序中选取最大的程序,记为s1 。
②计算剩余的存储空间 S = N - s1;
③从n-1个剩余的程序中选取最大的程序,记为s2;
④若s2 ≤ S,则将s2存放在存储空间中,并将新的剩余空间记为S = S -s2;否则跳过步骤③;
⑤重复步骤③④,直到所有程序都存放完毕。
采用贪心算法求解程序存储问题的数学模型,能够有效地求解出一组最佳解,从而使得最大存储空间得到实现。
- 1 -。
第五讲 贪心算法PPT课件
• Begin
•
S:=S+P[I]; M:=M-W[I];
• End
• Else {否则取一部分}
• Begin
•
S:=S+M*(P[I]/W[I]); Break;
• End;
• End;
11
• Procedure Out; {输出} • Begin • Assign(Output,Fout); Rewrite(Output); • Writeln(S:0:0); • Close(Output); • End; • Begin {主程序} • Init; • Work; • Out; • End.
23
• 分析:需要考虑如下问题: • (1)出发前汽车的油箱是空的,故汽车必须在起
点(1号站)处加油。加多少油? • (2)汽车行程到第几站开始加油,加多少油? • 可以看出,原问题需要解决的是在哪些油站加油
• (2) 原问题的最优解包含子问题的最优解,即问题具有最优 子结构的性质。在背包问题中,第一次选择单位质量最大的货 物,它是第一个子问题的最优解,第二次选择剩下的货物中单 位重量价值最大的货物,同样是第二个子问题的最优解,依次 类推。
• 其次,如何选择一个贪心标准?正确的贪心标准可以得到问 题的最优解,在确定采用贪心策略解决问题时,不能随意的判 断贪心标准是否正确,尤其不要被表面上看似正确的贪心标准 所迷惑。在得出贪心标准之后应给予严格的数学证明。
二
请在这里输入您的主要 叙述内容
三 请在这里输入您的主要叙述内容
2
一、引入:
• 若在求解一个问题时,能根据每次所得 到的局部最优解,推导出全局最优或最优 目标。那么,我们可以根据这个策略,每 次得到局部最优解答,逐步而推导出问题, 这种策略称为贪心法。
中国数学建模-编程交流-贪婪算法_1
贪婪算法分步构造这条路径,每一步在路径中加入一个顶点。假设当前路径已到达顶点q,
且顶点q 并不是目的顶点d。加入下一个顶点所采用的贪婪准则为:选择离q 最近且目前不在路径中的顶点。
这种贪婪算法并不一定能获得最短路径。例如,假设在图1 3 -
n s t r a i n t)和一个优化函数( optimization
function),符合限制条件的问题求解方案称为可行解( feasible
solution),使优化函数取得最佳值的可行解称为最优解(optimal solution)。
7。第五步考虑任务g,将其分配给机器M2,第六步将任务e 分配给机器M1, 最后在第七步,任务2分配给机器M3。(注意:任务d
也可分配给机器M2)。
上述贪婪算法能导致最优机器分配的证明留作练习(练习7)。可按如下方式实现一个复杂性为O (nl o
贪婪算法有种直觉的倾向,在找零钱时,直觉告诉我们应使找出的硬币数目最少(至少是接近最少的数目)。可以证明采用上述贪婪算法找零钱时所用的硬币数目的确最少(见练习1)。
例1-5 [机器调度] 现有n 件任务和无限多台的机器,任务可以在机器上得到处理。每件任务的开始时间为si,完成时间为fi;i = 1ai < t,则不可能找到问题的求解方案,因为即使喝光所有的饮料也不能使婴儿解渴。
对上述问题精确的数学描述明确地指出了程序必须完成的工作,根据这些数学公式,可以对输入/ 输出作如下形式的描述:
输入:n,t,si ,ai(其中1≤i≤n,n 为整数,t、si 、ai 为正实数)。
本章首先引入最优化的概念,然后介绍一种直观的问题求解方法:贪婪算法。最后,应用该算法给出货箱装船问题、背包问题、拓扑排序问题、二分覆盖问题、最短路径问题、最小代价生成树等问题的求解方案。
贪心算法+实例
贪⼼算法+实例贪⼼算法(⼜称贪婪算法)是指,在对时,总是做出在当前看来是最好的选择。
也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部。
(官⽅解释)。
所谓的贪⼼算法主要理解就在这个“贪⼼”上⾯,所谓贪⼼,就是找到最好的,也就是上⾯说的最优解。
我们可以通过各种⽅式找到当前的最优解,将最有解利⽤过后,将其清除,再去找下⼀个最优解。
来⼀个例⼦来说明。
题⽬描述鲁宾逊先⽣有⼀只宠物猴,名叫多多。
这天,他们两个正沿着乡间⼩路散步,突然发现路边的告⽰牌上贴着⼀张⼩⼩的纸条:“欢迎免费品尝我种的花⽣!――熊字”。
鲁宾逊先⽣和多多都很开⼼,因为花⽣正是他们的最爱。
在告⽰牌背后,路边真的有⼀块花⽣⽥,花⽣植株整齐地排列成矩形⽹格(如图111)。
有经验的多多⼀眼就能看出,每棵花⽣植株下的花⽣有多少。
为了训练多多的算术,鲁宾逊先⽣说:“你先找出花⽣最多的植株,去采摘它的花⽣;然后再找出剩下的植株⾥花⽣最多的,去采摘它的花⽣;依此类推,不过你⼀定要在我限定的时间内回到路边。
”我们假定多多在每个单位时间内,可以做下列四件事情中的⼀件:1) 从路边跳到最靠近路边(即第⼀⾏)的某棵花⽣植株;2) 从⼀棵植株跳到前后左右与之相邻的另⼀棵植株;3) 采摘⼀棵植株下的花⽣;4) 从最靠近路边(即第⼀⾏)的某棵花⽣植株跳回路边。
现在给定⼀块花⽣⽥的⼤⼩和花⽣的分布,请问在限定时间内,多多最多可以采到多少个花⽣?注意可能只有部分植株下⾯长有花⽣,假设这些植株下的花⽣个数各不相同。
例如在图2所⽰的花⽣⽥⾥,只有位于(2,5),(3,7),(4,2),(5,4)(2, 5), (3, 7), (4, 2), (5, 4)(2,5),(3,7),(4,2),(5,4)的植株下长有花⽣,个数分别为13,7,15,913, 7, 15, 913,7,15,9。
沿着图⽰的路线,多多在212121个单位时间内,最多可以采到373737个花⽣。
算法-第4章贪心法-PPT课件
i , j A , i j , f ( i ) t f ( j ) or f ( j ) t f ( i ) i j
12
实例
A={1, 2, 3, 4, 5}, T=<5, 8, 4, 10, 3>, D=<10, 12, 15, 11, 20> 调度1: f1(1)=0, f1(2)=5, f1(3)=13, f1(4)=17, f1(5)=27 各任务延迟:0, 1, 2, 16, 10; 最大延迟:16 5 1 2 13 3 17 4 27 5 30
18
i j
f2(j)=s f2(i)=s+tj
delay(f’,i)=s+tj+ti- di <delya(f,j)r delay(f, j)=s+ti+tj-dj
4.3 得不到最优解的处理方法
讨论对于哪些输入贪心法能得到最优解:输入条件 讨论贪心法的解最坏情况下与最优解的误差(见第8章)
例4.4 找零钱问题 设有 n 种零钱, 重量分别为w1, w2, ... , wn, 价值分别为 v1=1, v2, ... , vn. 需要付的总钱数是 Y .不妨设币值和钱数都为 正整数. 问:如何付钱使得所付钱的总重最轻?
设计思想:按完成时间从早到晚安排任务,没有空闲
15
交换论证:正确性证明
算法的解的性质: (1) 没有空闲时间, 没有逆序. (2) 逆序 (i, j): f(i) < f(j) 且 di > dj 引理4.1 所有没有逆序、没有空闲时间的调度具有相同的 最大延迟. 证: 设 f 没有逆序,在 f 中具有相同完成时间的客户i1, i2, … , ik 必被连续安排. 在这k个客户中最大延迟是最后一个客 户,被延迟的时间是 k
贪心算法-例题讲解
贪⼼算法-例题讲解前⾔:此博客在写作过程中参考了⼤量资料和博客,不能⼀⼀列举,还请见谅。
概述贪⼼法:从问题的某⼀个初始状态出发,逐步构造最优解从⽽向⽬标前进,并期望通过这种⽅法产⽣出⼀个全局最优解的⽅法贪⼼是⼀种解题策略,也是⼀种解题思想,⽽不是算法贪⼼策略与其他算法的区别贪⼼与递推:贪⼼法推进每⼀步不依据某⼀固定的递推式,⽽是当前看似最佳的贪⼼决策,不断的将问题归纳为更加⼩的相似的⼦问题贪⼼与动态规划:贪⼼是“⿏⽬⼨光”;动态规划是“统揽全局”贪⼼法的优缺点优点:思维复杂度低、代码量⼩、运⾏效率⾼、空间复杂度低等缺点:很难找到⼀个简单可⾏并且保证正确的贪⼼思路贪⼼算法的应⽤贪⼼算法的常⽤范围有明显的贪⼼可证明贪⼼策略的贪⼼(最常见的)贪⼼数据结构:堆/Kruskal/Prim/Dijkstra博弈/游戏策略,这些策略⼤多是贪⼼求较优解或多次逼近求最优解⼏个简单的贪⼼例⼦最优装载问题:给n个物体,第i个物体重量为wi,选择尽量多的物体,使得总重量不超过C贪⼼策略:先拿轻的部分背包问题:有n个物体,第i个物体的重量为wi,价值为vi,在总重量不超过C的情况下让总价值尽量⾼。
每⼀个物体可以只取⾛⼀部分,价值和重量按⽐例计算贪⼼策略:先拿性价⽐⾼的乘船问题:有n个⼈,第i个⼈重量为wi。
每艘船的载重量均为C,最多乘两个⼈。
⽤最少的船装载所有⼈贪⼼策略:最轻的⼈和最重的⼈配对例题(基础)1.删数问题-【问题描述】键盘输⼊⼀个⾼精度的正整数n(n<=240位),去掉其中任意s个数字后剩下的数字按照原来的次序将组成⼀个新的正整数。
编程对给定的n和s,寻求⼀种⽅案,使得剩下组成的新数最⼩。
贪⼼策略为:每⼀步总是选择⼀个使剩下的数最⼩的数字删去,即按⾼位到低位的顺序搜索,若各位数字递增,则删除最后⼀个数字,否则删除第⼀个递减区间的⾸字符。
然后回到串⾸,按上述规则再删除下⼀个数字。
重复以上过程s次,剩下的数字串便是问题的解了。
第4章贪心算法1例子
4.7 多机调度问题
特别地,对m=1时, 1)若n个作业都必须完成,如何调度? 2)若在时间t内,使得尽可能多的任务
完成,如何调度?
解答:
1)n个作业都必须完成,完成时间是确 定的,无所谓调度,谁先谁后都可 以。
2)若在时间t内,使得尽可能多的任务
完成,应短作业优先。
36
贪心法小结
37
贪心法 正确性证明
4.3 最优装载
有一批集装箱要装上一艘载重量为c的轮船。其 中集装箱i的重量为Wi。最优装载问题要求确定在 装载体积不受限制的情况下,将尽可能多的集装箱 装上轮船。
1、算法描述 最优装载问题可用贪心算法求解。采用重量最
轻者先装的贪心选择策略,可产生最优装载问题的 最优解。具体算法描述如下页。
1
4.3 最优装载
33
4.7 多机调度问题
例如,设7个独立作业{1,2,3,4,5,6,7}由3台 机器M1,M2和M3加工处理。各作业所需的处理时 间分别为{2,14,4,16,6,5,3}。按算法greedy产生 的作业调度如下图所示,所需的加工时间为17。
34
4.7 多机调度问题
再看一例:: N={10, 10, 10, 10, 10, 7, 7, 7, 7, 7, 5, 5, 5, 5}, m=3
并”运算后产生最终所要求的树T。
10
4.4 哈夫曼编码
11
4.4 哈夫曼编码
12
4.4 哈夫曼编码
在书上给出的算法huffmanTree中: 每一字符c的频率是f(c); 以f为键值的优先队列Q采用最小堆实现; 用贪心选择当前要合并的2棵具有最小频率的树; 一旦2棵具有最小频率的树合并后,产生一棵新的树,