网站大量收购闲置独家精品文档,联系QQ:2885784924

8月22日贪心法课件.ppt

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
8月22日贪心法课件

均分纸牌 [问题描述]? 有N堆纸牌,编号分别为1,2,….N。每堆上有若干张, 但纸牌总数必为N的倍数。可以在任一堆上取若干张纸牌,然后移动。移牌规则为:在编号为1堆上取的纸牌,只能移到编号为2的堆上;在编号为N的堆上取的纸牌,只能移到编号为N-1的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。例如N=4,4堆纸牌数分别为: ① 9 ② 8 ③ 17 ④ 6 移动3次可达到目的:从③取4张牌放到④(9 8 13 10)→从③取3张牌放到②(9 11 10 10)→从②取1张牌放到①(10 10 10 10)。 [ 输 入 ]: N ( N 堆纸牌,1≤N≤100) A1,A2,….An (N 堆纸牌,每堆纸牌初始数,1≤Ai≤10000) [ 输 出 ]:所有堆均达到相等时的最少移动次数。 [输入输出样例];输入: 4 9 8 17 6 ;问题是,在从第i+1堆中取出纸牌补充第i堆的过程中,可能会出现第i+1堆的纸牌数小于零(list[i+1]-(ave-list[i])0 )的情况,这时可以理解为一个“先出后进”的栈。由于纸牌的总数是n的倍数,因此后面的堆会补充第i+1堆ave-list[i]-list[i+1]+ ave张纸牌,使其达到均分的要求。 ;任务调度问题 ;定义两个概念: ;例如 任务i 1 2 3 4 5 6 7 期限di 4 2 4 3 1 4 6 罚款wi 70 60 50 40 30 20 10 最初,我们设所有n个时间空位都是空的。然后按罚款的单调递减顺序(任务1,任务2,任务3,任务4,任务5,任务6,任务7)来考虑各个子任务。在考虑任务j时,如果有一个恰处于或前于dj 的时间空位仍空着,则将任务j赋与最近的这样的空位,并填入;如果不存在这样的空位,则将任务j赋与一个还未被占的、最近的空位。 按上述贪心策略选择了任务1,2,3,4,7,放弃任务5,6。最终的最优调度为〈2,3,4,1,7,5,6〉,其总的罚款为W5 +W6 =50 ;设N─任务个数,num─目前早任务个数;t─罚款总和 list─任务序列。其中list[i].k、 list[i].d、 list[i].w为任务I的编号,期限和罚款。 list[i].k0,则任务i为早任务;list[i].k0,则任务i为迟任务;lt─辅助数组 Pck为早任务的编号序列; 算法如下: 读入任务数N; For i := 1 to N Do Begin 读入任务i的期限List[i].d和罚款List[i].w; List[i].k := I{记下其序号} End;{for} list序列按罚款单调递减的顺序排序 ; ? ;num := 0; For i := 1 to N Do Begin{依次处理每一个任务} t := 0;{统计目前num个早任务中期限小于等于num的任务个数t} For j := 1 to num Do If List[Pck[j]].d = num Then Inc(t); If t List[i].d Then Begin{若有一个恰处于或前于第j个任务期限的时间空位,则早任务个数+1;任务i进入早任务集合} Inc(num);Pck[num] := i; List[i].k := - List[i].k;{设任务i为早任务标志} j := num;{将早任务按期限递增顺序排列} While (j 1) And (List[Pck[j]].d List[Pck[j - 1]].d) Do Begin t := Pck[j]; Pck[j] := Pck[j - 1]; Pck[j - 1] := t;Dec(j); End{while} End{then} End;{for} For i := 1 to num Do打印第I个早任务的序号- List[Pck[i]].k; t := 0;{打印所有迟任务并累计罚款总和} For i := 1 to N Do If List[i].k 0 Then Begin打印迟任务的序号List[i].k; t := t + List[i].w;End;{then} 输出总

文档评论(0)

gm8099 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档