第6章贪心算法.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
【样例输入】 3 1 2 9 【样例输出】 15 【数据规模】 对于30%的数据,保证有n = 1000; 对于50%的数据,保证有n = 5000; 对于全部的数据,保证有n = 10000。 8、美元汇率(DOLLARS.PAS) 【问题描述】 在以后的若干天里戴维将学习美元与德国马克的汇率。编写程序帮助戴维何时应买或卖马克或美元,使他从100美元开始,最后能获得最高可能的价值。 【输入格式】 输入文件的第一行是一个自然数N,1≤N≤100,表示戴维学习汇率的天数。 接下来的N行中每行是一个自然数A,1≤A≤1000。第i+1行的A表示预先知道的第i+1天的平均汇率,在这一天中,戴维既能用100美元买A马克也能用A马克购买100美元。 【输出格式】 输出文件的第一行也是唯一的一行应输出要求的钱数(单位为美元,保留两位小数)。 注意:考虑到实数算术运算中进位的误差,结果在正确结果0.05美元范围内的被认为是正确的,戴维必须在最后一天结束之前将他的钱都换成美元。 【输入样例】DOLLARS.IN 5 400 300 500 300 250 【输出样例】DOLLARS.OUT 266.66 样例解释 (无需输出) Day 1 ... changing 100.0000 美元= 400.0000 马克 Day 2 ... changing 400.0000 马克= 133.3333 美元 Day 3 ... changing 133.3333 美元= 666.6666 马克 Day 5 ... changing 666.6666 马克= 266.6666 美元 9、零件分组(stick.pas) 【问题描述】 某工厂生产一批棍状零件,每个零件都有一定的长度(Li)和重量(Wi)。现在为了加工需要,要将它们分成若干组,使每一组的零件都能排成一个长度和重量都不下降(若ij,则Li=Lj,Wi=Wj)的序列。请问至少要分成几组? 【输入格式】 第一行为一个整数N(N=1000),表示零件的个数。第二行有N对正整数,每对正整数表示这些零件的长度和重量,长度和重量均不超过10000。 【输出格式】 仅一行,即最少分成的组数。 【输入样例】STICK.IN 5 8 4 3 8 2 3 9 7 3 5 【输出样例】STICK.OUT 2 第六章 贪心算法 若在求解一个问题时,能根据每次所得到的局部最优解,推导出全局最优或最优目标。那么,我们可以根据这个策略,每次得到局部最优解答,逐步而推导出问题,这种策略称为贪心法。下面我们看一些简单例题。 【例1】在N行M列的正整数矩阵中,要求从每行中选出1个数,使得选出的总共N个数的和最大。 【算法分析】 要使总和最大,则每个数要尽可能大,自然应该选每行中最大的那个数。因此,我们设计出如下算法: 读入N, M,矩阵数据; Total = 0; for (int I = 1; I = N; ++ l) { //对N行进行选择 选择第I行最大的数,记为K; Total += K; } 输出最大总和Total; 从上例中我们可以看出,和递推法相仿,贪心法也是从问题的某一个初始解出发,向给定的目标递推。但不同的是,推进的每一步不是依据某一固定的递推式,而是做一个局部的最优选择,即贪心选择(在例中,这种贪心选择表现为选择一行中的最大整数),这样,不断的将问题归纳为若干相似的子问题,最终产生出一个全局最优解。 特别注意的是,局部贪心的选择是否可以得出全局最优是能否采用贪心法的关键所在。对于能否使用贪心策略,应从理论上予以证明。下面我们看看另一个问题。 【例2】部分背包问题 给定一个最大载重量为M的卡车和N种食品,有食盐,白糖,大米等。已知第i种食品的最多拥有Wi公斤,其商品价值为Vi元/公斤,编程确定一个装货方案,使得装入卡车中的所有物品总价值最大。 【算法分析】 因为每一个物品都可以分割成单位块,单位块的利益越大显然总收益越大,所以它局部最优满足全局最优,可以用贪心法解答,方法如下:先将单位块收益按从大到小进行排列,然后用循环从单位块收益最大的取起,直到不能取为止便得到了最优解。 因此我们非常容易设计出如下算法: 问题初始化; //读入数据 按Vi从大到小将商品排序;   i=1;   do   {    if (m==0) break;

文档评论(0)

希望之星 + 关注
实名认证
内容提供者

我是一名原创力文库的爱好者!从事自由职业!

1亿VIP精品文档

相关文档