贪心法(The Greedy Method)

合集下载

列举用贪心算法求解的经典问题

列举用贪心算法求解的经典问题

列举用贪心算法求解的经典问题贪心算法是一种简单而高效的问题求解方法,通常用于求解最优化问题。

它通过每一步选择当前状态下的最优解,最终得到全局最优解。

贪心算法的核心思想是:每一步都做出一个局部最优的选择,并认为这个选择一定可以达到全局最优。

以下是一些经典问题,可以用贪心算法求解:1. 零钱兑换问题(Coin Change Problem):给定一些不同面额的硬币和一个目标金额,找到最少的硬币数量,使得硬币总额等于目标金额。

贪心算法可以按照硬币的面额从大到小进行选择,每次选择尽量大面额的硬币。

2. 区间调度问题(Interval Scheduling Problem):给定一些区间,找到最多的不相交区间。

贪心算法可以按照区间的结束时间进行排序,每次选择结束时间最早的区间,确保选择的区间不重叠。

3. 分糖果问题(Candy Problem):给定一个数组表示每个孩子的评分,要求给这些孩子分糖果,满足以下要求:每个孩子至少分到一个糖果,评分高的孩子要比相邻孩子分到的糖果多。

贪心算法可以从左到右进行两次遍历,分别处理评分递增和评分递减的情况。

4. 跳跃游戏问题(Jump Game Problem):给定一个非负整数数组,表示每个位置的最大跳跃长度,判断是否能从第一个位置跳到最后一个位置。

贪心算法可以记录当前能够到达的最远位置,并且更新为更远的位置。

5. 任务调度器问题(Task Scheduler Problem):给定一串任务,每个任务需要一定的冷却时间,要求以最短的时间完成所有任务。

贪心算法可以按照出现次数进行排序,优先执行出现次数最多的任务,并在冷却时间内执行其他任务。

6. 区间覆盖问题(Interval Covering Problem):给定一些区间,找到最少的区间数,使得它们的并集覆盖了所有输入区间。

贪心算法可以根据区间的起始位置进行排序,每次选择最早结束的区间,并将它添加到最终结果中。

以上仅是一些经典问题的例子,实际上还有很多问题可以用贪心算法来求解。

贪心算法的概念和适用条件

贪心算法的概念和适用条件

贪心算法的概念和适用条件什么是贪心算法?贪心算法(Greedy Algorithm)是一种以局部最优解为导向的算法思想,通过每一步选择当前状态下的最佳操作来达到整体最优解的目标。

贪心算法的核心思想是每次都做出当前看来最优的选择,以期望能够达到整体的最优解。

贪心算法通常用于一些问题中,即每一步的选择只依赖于当前状态,而不考虑将来可能出现的情况。

贪心算法的适用条件:1. 贪心选择性质:贪心算法每一步都选择一个当前的最优解,此处的“最优”指的是局部最优。

这种最优选择可以确保问题能够被拆解,并且进行下一步求解。

2. 最优子结构性质:当问题的整体最优解能够通过局部最优解得到时,可以采用贪心算法求解。

这种情况下,问题的最优解可以由子问题的最优解推导出来。

3. 无后效性:贪心算法选择某一步操作时,只考虑当前状态,不会改变以前的操作,并且不关心未来的操作。

这种无后效性使得贪心算法在实际应用中操作简单、效率高。

贪心算法的基本步骤:1. 确定问题的局部最优解:贪心算法的核心是每一步都选择在当前情况下的最优解。

因此,需要确定问题如何拆解以及如何进行局部最优选择。

2. 定义问题的子问题:根据问题的最优子结构性质,将问题拆解为较小规模的子问题。

子问题应该是原问题的一个更小、更简单的实例。

3. 定义贪心选择策略:根据问题的特性,确定当前步骤下的最优选择策略。

这个选择应该是局部最优的,可以在不考虑子问题和整体未来状态的情况下得出。

4. 重复执行步骤2和3,直至求解出全局最优解。

贪心算法的优缺点:贪心算法具有简单易懂、快速高效的特点,适用于许多实际问题。

它可以避免穷举所有可能性,节省了计算时间。

此外,贪心算法常常能够找到近似最优解,尽管不一定能够保证全局最优解。

在实际问题中,近似最优解也往往可以满足实际需求。

然而,贪心算法并非适用于所有问题。

由于贪心算法只考虑当前状态的最优选择,而不考虑未来的影响,因此可能会导致局部最优解与全局最优解不一致。

贪心法

贪心法

贪心法贪心法(Greedy Approach)又称贪婪法, 在对问题求解时,总是做出在当前看来是最好的选择,或者说是:总是作出在当前看来最好的选择。

也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。

当然,希望贪心算法得到的最终结果也是整体最优的。

虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。

如单源最短路经问题,最小生成树问题等。

在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。

贪心法的设计思想当一个问题具有以下的性质时可以用贪心算法求解:每一步的局部最优解,同事也说整个问题的最优解。

如果一个问题可以用贪心算法解决,那么贪心通常是解决这个问题的最好的方法。

贪婪算法一般比其他方法例如动态规划更有效。

但是贪婪算法不能总是被应用。

例如,部分背包问题可以使用贪心解决,但是不能解决0-1背包问题。

贪婪算法有时也用用来得到一个近似优化问题。

例如,旅行商问题是一个NP难问题。

贪婪选择这个问题是选择最近的并且从当前城市每一步。

这个解决方案并不总是产生最好的最优解,但可以用来得到一个近似最优解。

让我们考虑一下任务选择的贪婪算法的问题, 作为我们的第一个例子。

问题:给出n个任务和每个任务的开始和结束时间。

找出可以完成的任务的最大数量,在同一时刻只能做一个任务。

例子:下面的6个任务:start[] = {1, 3, 0, 5, 8, 5};finish[] = {2, 4, 6, 7, 9, 9};最多可完成的任务是:{0, 1, 3, 4}贪婪的选择是总是选择下一个任务的完成时间至少在剩下的任务和开始时间大于或等于以前选择任务的完成时间。

我们可以根据他们的任务完成时间,以便我们总是认为下一个任务是最小完成时间的任务。

1)按照完成时间对任务排序2)选择第一个任务排序数组元素和打印。

3) 继续以下剩余的任务排序数组。

……a)如果这一任务的开始时间大于先前选择任务的完成时间然后选择这个任务和打印。

第三章 贪心算法

第三章 贪心算法
Dde+Dab+Dbc+Def+[Ddf];(形成小回路,舍弃) Dde+Dab+Dbc+Def+[Dbe];(b顶点度数超过2,舍弃) Dde+Dab+Dbc+Def+[Dbd];(b顶点度数超过2,舍弃) Dde+Dab+Dbc+Def+Dcd; Dde+Dab+Dbc+Def+Dcd+[Dbf];(b顶点度数超过2,舍弃) Dde+Dab+Dbc+Def+Dcd+[Dce];(c、e顶点度数超过2,舍弃) Dde+Dab+Dbc+Def+Dcd+[Dae];(e顶点度数超过2,舍弃) Dde+Dab+Dbc+Def+Dcd+[Dae];(e顶点度数超过2,舍弃) Dde+Dab+Dbc+Def+Dcd+[Dad];(d顶点度数超过2,舍弃) Dde+Dab+Dbc+Def+Dcd+Daf;得到1条回路
2021/2/22
5
如果问题改成:砝码的种类分别为11克、5克和1克, 待称的物体是15克。用贪婪算法应先选一个11克的,然 后选四个1克的,共用五个砝码。这不是最优结果,只 要用三个5克的砝码就够了。
贪婪算法虽不能保证得到最优结果,但对于一些除
了“穷举”方法外没有有效算法的问题,用贪婪算法往
往能很快地得出较好的结果,如果此较好结果与最优结 果相差不是很多的话,此方法还是很实用的。
2021/2/22
9
当n不太大时,适当的取k值,此改进方法常常可以得到 最优解,但不能因此就说一般背包问题有多项式算法。 当n增大时,k不能随着n不断的加大,如k随n增大而同 时加大,其复杂性就是指数型而不是多项式型的了,而 如k取值较小,又不能保证得出最优解。

c++贪心算法经典例题

c++贪心算法经典例题

c++贪心算法经典例题和详解贪心算法(Greedy Algorithm)是一种优化问题解决方法,其基本思想是每一步都选择当前状态下的最优解,以期望达到全局最优解。

贪心算法的特点是每一步都要做出一个局部最优的选择,而这些局部最优选择最终构成了全局最优解。

下面是一个经典的贪心算法例题以及详解:例题:活动选择问题(Activity Selection Problem)假设有一个需要在同一时段使用同一个资源的活动集合,每个活动都有一个开始时间和结束时间。

设计一个算法,使得能够安排最多数量的互不相交的活动。

# 输入:-活动的开始时间数组`start[]`。

-活动的结束时间数组`end[]`。

# 输出:-选择的互不相交的活动的最大数量。

# 算法详解:1. 首先,将活动按照结束时间从小到大排序。

2. 选择第一个活动,并将其加入最终选择的集合中。

3. 对于剩下的活动,选择下一个结束时间最早且与前一个活动不冲突的活动。

4. 重复步骤3,直到所有活动都被选择。

```cpp#include <iostream>#include <algorithm>#include <vector>using namespace std;// 定义活动结构体struct Activity {int start, end;};// 比较函数,用于排序bool compareActivities(Activity a, Activity b) {return a.end < b.end;}// 贪心算法解决活动选择问题void activitySelection(vector<Activity>& activities) {// 按照结束时间排序sort(activities.begin(), activities.end(), compareActivities);// 第一个活动总是被选中cout << "Selected activity: (" << activities[0].start << ", " << activities[0].end << ")" << endl;// 选择其余活动int lastSelected = 0;for (int i = 1; i < activities.size(); i++) {// 如果当前活动的开始时间大于等于上一个选择的活动的结束时间,则选择该活动if (activities[i].start >= activities[lastSelected].end) {cout << "Selected activity: (" << activities[i].start << ", " << activities[i].end << ")" << endl;lastSelected = i;}}}int main() {vector<Activity> activities = {{1, 2}, {3, 4}, {0, 6}, {5, 7}, {8, 9}, {5, 9}};cout << "Activities before sorting:" << endl;for (const Activity& activity : activities) {cout << "(" << activity.start << ", " << activity.end << ") ";}cout << endl;activitySelection(activities);return 0;}```在这个例子中,我们首先定义了一个活动的结构体`Activity`,然后编写了一个比较函数`compareActivities` 用于排序。

c++贪心算法经典例题

c++贪心算法经典例题

c++贪心算法经典例题摘要:一、贪心算法简介1.贪心算法的定义2.贪心算法的特点3.贪心算法适用的问题类型二、C++贪心算法经典例题1.背包问题a.0-1 背包问题b.完全背包问题c.动态背包问题2.最小生成树a.Kruskal 算法b.Prim 算法3.单源点最短路径a.Dijkstra 算法b.Floyd-Warshall 算法4.最长公共子序列a.贪心算法实现b.动态规划实现正文:一、贪心算法简介贪心算法(Greedy Algorithm)是一种求解最优解的方法。

它是在对问题求解时,总是做出在当前看来是最好的选择。

贪心算法并不追求整体最优解,只希望得到较为满意的解。

贪心算法的关键是贪心策略的选择,必须满足无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。

贪心算法适用的问题类型包括背包问题、最小生成树、单源点最短路径和最长公共子序列等。

二、C++贪心算法经典例题1.背包问题背包问题(Knapsack Problem)是一种典型的贪心算法问题。

它描述的是有一个背包,有一定的容量,需要装载若干物品,每个物品有一定的价值和重量,要求在不超过背包容量的前提下,如何选择装载物品使得背包中的物品总价值最大。

背包问题可以分为0-1 背包问题、完全背包问题和动态背包问题。

2.最小生成树最小生成树(Minimum Spanning Tree,简称MST)是一种图论中的算法问题。

给定一个加权连通图,求解一个生成树,使得该生成树中所有边的权值之和最小。

最小生成树的经典算法有Kruskal 算法和Prim 算法。

3.单源点最短路径单源点最短路径(Single Source Shortest Path)问题是在一个图中,从源点出发到其他所有顶点的最短路径。

经典算法包括Dijkstra 算法和Floyd-Warshall 算法。

4.最长公共子序列最长公共子序列(Longest Common Subsequence,简称LCS)问题是求两个序列中最长的公共子序列。

信息学竞赛常用算法

信息学竞赛常用算法

信息学竞赛常用算法一、贪心算法(Greedy Algorithm)贪心算法是一种简单而直观的算法,它的核心思想是每一步都选择最优解,希望最终的结果也能最优。

贪心算法常常用于求解最小生成树、最短路径、背包问题等。

例如,在最小生成树问题中,贪心算法可以根据边的权重选择最小的边,直到生成树包含所有节点。

二、动态规划(Dynamic Programming)动态规划是一种通过将问题分解为子问题,并存储子问题的解来解决复杂问题的方法。

它常常用于求解最长公共子序列、最大子数组和、背包问题等。

动态规划的核心思想是,通过计算和存储子问题的解,避免重复计算,从而提高算法的效率。

三、深度优先(Depth First Search)深度优先是一种用于遍历或图或树的算法,其核心思想是尽可能深入地一个分支,直到无法继续为止,然后回溯到上一个节点,继续其他分支。

深度优先可以用于求解拓扑排序、连通分量、可达性等问题。

四、广度优先(Breadth First Search)广度优先是一种用于遍历或图或树的算法,其核心思想是从根节点开始,依次与当前节点相邻的节点,直到找到目标节点为止。

广度优先可以用于求解最短路径、连通性、迷宫问题等。

五、并查集(Union Find)并查集是一种用于管理元素间的等价关系的数据结构。

并查集主要包括两个操作:查找和合并。

查找操作用于确定元素所属的集合,合并操作用于将两个元素所属的不同集合合并为一个集合。

并查集常常用于求解连通性问题、最小生成树问题等。

六、最小生成树(Minimum Spanning Tree)最小生成树是一种用于连接一个连通图的所有节点,并且边的权重之和最小的树形结构。

最小生成树算法主要包括Prim算法和Kruskal算法。

Prim算法是一种贪心算法,通过选择最小权重的边进行扩展,直到生成树包含所有节点。

Kruskal算法通过不断添加权重最小的边,直到生成树包含所有节点。

七、最短路径(Shortest Path)最短路径是一种从起点到终点的路径中,总权重最小的路径。

(算法分析与设计)2.贪心算法

(算法分析与设计)2.贪心算法

n
wixi
vixi
28.2
31
31.5
...
i1
[算法思路]1).将各物体按单位价值由高到低排序.
2).取价值最高者放入背包.
3).计算背包剩余空间.
4).在剩余物体中取价值最高者放入背包.
若背包剩余容量=0或物体全部装入背包为止
算法设计与分析 > 贪心算法
背包问题的贪心算法
print tour, cost }
*该算法不能求得最优解. 算法的最坏时间复杂性为O(n2)
该问题为NP难问题.
算法设计与分析 > 贪心算法
4.7 多机调度问题
问题:设有n个独立的作业{1, 2, …, n}, 由m台相同的机器进行加工 处理. 作业i所需时间为t i. 约定:任何作业可以在任何一台机器上 加工处理, 但未完工前不允许中断处理,任何作业不能拆分成更小 的子作业。要求给出一种作业调度方案,使所给的n 个作业在尽 可能短的时间内 由m台机器加工处理完成。 该问题为NP完全问题.
A complete tree is filled from the left: • all the leaves are on • the same level or • two adjacent ones and • all nodes at the lowest level are as far to the left as possible.
最大相容活动子集(1, 4, 8, 11), 也可表示为等长n元数组:(1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1)
算法设计与分析 > 贪心算法
活动安排问题贪心算法
template< class Type > void GreedySelector(int n, Type s[ ], Type f[ ], bool A[] ) { A[ 1 ] = true;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

13.2 贪心法
贪心法指每步(stage)按所谓的“贪心标准(策略)”选择 (元组的)一个分量,逐步构造出问题解的方法。 贪心法的主要特点是:
分阶段完成:按一定的步骤,每步决定一个分量(自顶向下 自顶向下) 自顶向下 不回溯:选定一个分量后,不重试其它可能 贪心标准:指每次选择一个分量时使用的“优化”策略。所 选策略可能导致优化解,但更多情形是得到近似解,特别是 对NP-难度问题。不同的人可能有不同的“优化”策略。 常常采纳使目标函数有最大增量的策略为贪心策略。
例13.1[Thirsty Baby]
有一个聪明的婴儿,她可能得到的饮料包括一 桶水、一桶牛奶、多罐不同种类的果汁、许多 不同的装在瓶子或罐子中的苏打水。假定婴儿 可得到n 种不同的饮料。根据以前关于这n 种 饮料的不同体验,婴儿知道其中那些饮料更合 自己的胃口。因此,婴儿为每一种饮料赋予一 个满意度值si:饮用1盎司第i 种饮料,满意 度s i 。 设第i种饮料有ai盎司,婴儿共需喝t盎司饮料
最优分配指占用机器数最少的可行分配。
图13-1 任务及三台机器的调度 a) 7个任务 b)调度
例13.5(续)
贪心算法:
步骤:按任务起始时间排序并安排任务 贪心准则:尽可能使用旧机器,即以前使用过的机 器
上述贪心法产生优化解,因为:
任何可行解使用的机器数不少于最大重迭任务数 贪心解使用的机器数不超过最大重迭任务数
k=0,1时获得的最优解为[1,0,0,1],获得的价值为19 。
n=4, c=11,w=[2,4,6,7], p=[6,10,12,13]
例13.9(续2)
若k=2,除了考虑k<2的子集,还必需考虑子 集{1,2} , {1,3} , {1,4} , {2,3} , {2,4}和{3,4}。
对于{1,2} ,可行解为[1,1,0,0] ,最优值为16 对于{1,3} ,可行解为[ 1,0,1,0],最优值为18 对于{1,4} ,可行解为[ 1,0,0,1],最优值为19 对于{2,3} ,可行解为[ 0,1,1,0],最优值为22 对于{2,4} ,可行解为[ 1,0,0,1],最优值为23 {3,4}是不可行的
当k=0时,同于前述的密度贪心法。因此解为 x=[1,1,0,0],效益值为16。
例13.9(续1)
k =1时。初始子集为{1} , {2} , {3} , {4}。
子集{1} , {2}产生与k=0时相同的结果:x=[1,1,0,0],效益 值为16。 考虑子集{3},置x3 为1。此时还剩5个单位的容量,按价值 密度非递增顺序来考虑如何利用这5个单位的容量。首先考 虑物品1,它适合,因此取x1为1,这时仅剩下3个单位容量 了,且剩余物品没有能够加入背包中的物品。通过子集{3}开 始求解得结果为x=[1,0,1,0],获得的价值为18。 若从子集{4}开始,产生的解为x=[1,0,0,1],获得的价值为19。
贪心策略1:从未装入的物品中,选出效益值最 大的物品装入
利用这种规则,效益值最大的物品首先被装入(假设 有足够容量),然后是下一个效益值最大的物品,如 此继续下去。 这种策略不能保证得到最优解 n=3,c=105,w=[100,10,10],p=[20,15,15] 贪心解为:[1,0,0],效益值为:20 优化解为:[0,1,1],效益值为30
2-优化解即为[0,1,0,1],值为23
n=4, c=11,w=[2,4,6,7], p=[6,10,12,13]
例13.9结论
k-优化方法(k>0)得到的解误差不超过 优化方法( 优化方法 得到的解误差不超过 (100/(k+1))% % 以内,即如优化值为 当k=1时,为50%以内 即如优化值为 时为 以内 即如优化值为100,贪心法 贪心法 算出的值不低于50;当 以内. 算出的值不低于 当k=2时,为33.33%以内 时为 以内 算法的时间复杂度随k 的增大而增加,需要测试 算法的时间复杂度随 的增大而增加 需要测试 的子集数目为O(nk ),每一个子集所需时间为 的子集数目为 每一个子集所需时间为 O(n),因此当 >0时总的时间开销为 因此当k 时总的时间开销为 时总的时间开销为O(nk+1 )。 因此当
∑w x ≤ c
i=1 i=1 n i i
n
∑x
i =1
i
n
max∑ xi
i =1
例13.3 [最小成本通信网络]
城市之间的通信网络应是以这些城市为顶点的 连通图,图的每条边代表一条通信线路.给每条 边赋予一个权值,等于建设这条通信线路所要 花费的成本,最小成本通信网络问题就是找这 样一个连通图,其总成本最小. , . 设所有的权值都非负,则最小成本通信网络问 题的可行解可限制为连接这些城市的生成树, 而最优解是其中具有最小成本的生成树.
问题的解可表示为一复杂的结构, ( x1 , x2 ,⋯ , xn ) xi ∈ si 例如元组形式 约束条件(结构性的约束条件 B ( x1 ,…, xn )
使约束条件为true的元组称为可 行解(feasible solution)
目标函数
f ( xi … , x n )
优化解即指使目标函数极大化(或 极小化)的可行解,对应的目标函 数值称为优化值。 很多优化问题是NP-难度问题, 迄今找不到它们的多项式算法。 所以计算上可行的方法就是求其 近似解。贪心法是求近似算法的 主要途径之一。
货箱装船问题(Container Loading) 背包问题(Knapsack Problem) 拓扑排序问题(Topological Sorting ) 最短路径问题(Shortest Path) 最小代价生成树(Minimum Spanning Tree)
本章小结
13.1优化问题
一个优化问题可以描述如下:
20-25美分之间:选2个10美分最好. 25-30美分之间选一个25最好; 30美分:一个25加一个5美分等等.
硬币面值之间有倍数关系;否则没解:例如,面值14,12,5 和1;
则17=12+5,用2枚硬币,而贪心法为14加3个1,共4枚硬币.
例13.5 [机器调度]
现有n 个任务和足够多台处理这些任务的机器。
贪心法(The Greedy Method)
宫秀军 天津大学计算机科学与技术学院 gongxj@ /~gongxj/course/algorithm
提纲
最优化问题(Optimization problem) 贪心算法基本原理(The principle of greedy method) 贪心算法应用
例13.1[Thirsty Baby]
设xi 为第i种饮料的饮用 量,假定满意程度是可 加的,则最满意的选择 是极大化 该优化问题可表示如下
n
n

i =1
si xi
约束条件 目标函数

i =1
xi = t
0 ≤ xi ≤ ai
n
Байду номын сангаас
f ( xi …, xn ) = ∑si xi
i =1
例13.2[loading Problem]
(续)
贪心策略2:从尚未装入的物品中选择重量最 小的物品。
虽然这一贪心法对于上述例子能产生最优解,但在 一般情况下不一定能得到最优解 n=2,c=25,w=[10,20],p=[5,100]
贪心策略3:按密度pi/wi,从剩余物品中选择 可装入背包的密度值最大的物品,这种策略也 不能保证得到最优解:
n=3,c=30,w=[20,15,15],p=[40,25,25]
贪心解为[1,0,0],但优化解为[0,1,1]
(续)
密度贪心法的伪代码: (1)将物品按密度从大到小排序 (2)for (i=1;i<n;i++) if (物品i 可装入到背包内) xi=1(装入) else xi=0(舍弃); 例如:c=11,w=(2,4,6,5),p=(6,10,12,9) x=(1,1,0,1).恰是优化解 算法的时间复杂度为O(nlogn)
(续)
贪心法往往不能得到精确解,贪心解与最优解 的误差用以下比值的百分比来度量: (优化值-贪心解值)/优化值 n=2,c=y, w=[1,y],p=[10,9y]
贪心解值=10; 当y>10/9时,优化值=9y.
误差为(9y-10)/9y. 对任意大的y误差可近似达到百分之百.
例13.9 k-优化算法
上述贪心法产生的解是优化解:
优化解(y1,…,yn)可经有限次替换得到贪心解,而且每 次替换箱子数不变. 如该优化解不会箱子1,将其替换其中一个箱子,仍是 优化解.(必须替换,否则不是优化解)反复替换将得到 一个优化解,它就是贪心法得到的解.
13.2.2 0/1背包问题
0/1背包问题:设有容量c的背包,和n件物品, 物品i的重量为wi,假定装入物品i获得的效益 值为pi,试给出一装入物品的方法,使得获得的 总效益值最大。 集装箱装载问题是0/1背包问题的特例。 0/1背包问题是NP-难度问题。所以贪心法产 生的解是近似解。
基本要素
贪心选择性质:所求问题的整体最优解可以通过一系列局部 最优选择(贪心选择)来达到 最优子结构性质:问题的最优解包含其子问题的最优解
例13.4[找零钱]
一个小孩买了价值少于1美元的糖,并将1美元的钱放 入取款机。取款机要用数目最少的硬币将零钱找给小 孩。假设取款机内有任意多的面值为25美分、10美分、 5美分、及1美分的硬币。 贪心策略为:每次给出不超过应找钱数的面值最大的 硬币。 贪心策略得到优化解:
k-优化算法是上述密度贪心算法的改进,改进 后其误差可控值在100/(k+1)%之内. k-优化算法:
预先将不超过k种物品的子集装入背包,对其余物 品用密度贪心法。 对所有k物品子集执行上述过程,并从中找到有最 大效益值的解。
相关文档
最新文档