- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
贪心算法
一、贪心法的思想
在实际问题中,经常会遇到求一个问题的最优解,这就是所谓的最优化问题。最优化问题往往包含一
组限制条件和一个优化函数,符合条件的解决方案称为可行解,使优化函数取得最佳值的可行解称为最优解。
贪心法是求解这类问题的一种常用算法,它的思想和做法是这样:从问题的某一个初始解出发,采用
逐步构造(迄今为止)最优解的方法向给定的目标前进。在每个局部阶段,都做出一个看上去最优的决策
(即某种意义下的、或某个标准下的局部最优解),并期望通过每次所做的局部最优选择,能够产生出一
个全局最优解来。做出贪心决策的依据称为贪心准则(策略)。贪心与递推不同的是,推进的每一步不是依据某一固定的递推公式,而是做一个当时看似最佳的贪心选择,从而不断地将问题实例归纳为更小的相似子问题。在有些最优化问题中,采用贪心法求解不能保证一定得到最优解,这时可以采取一些变形的贪心法或其他解决最优化问题的方法(如动态规划方法)。下面我们通过几个应用实例来看看贪心法的应用。
二、应用举例
【例3】删数问题
通过键盘输入一个高精度的正整数n(n的有效位数≤240),去掉其中任意s个数字后,剩下的数字按
原左右次序将组成一个新的正整数。编程对给定的n 和s,寻找一种方案,使得剩下的数字组成的新数小。
输入:n
s
输出:最后剩下的最小数
【样例输入】
178543
S=4
【样例输出】
13
【问题分析】
由于正整数n的有效位数最大可达240位,所以可以采用字符串类型来存储n。那么,应如何来确定该删除哪s位呢?是不是只要删掉最大的s个数字就可以了呢?为了尽可能地逼近目标,我们选取的贪心策略为:每一步总是选择一个使剩下的数最小的数字删去,即按高位到低位的顺序搜索,若各位数字递增,则删除最后一个数字,否则删除第一个递减区间的首字符。然后回到串首,按上述规则再删除下一个数字。
重复以上过程s次,剩下的数字串便是问题的解了。例如:对n=178543,s=4,删数的过程如下:
n=178543 {删掉8}
n=17543 {删掉7}
n=1543 {删掉5}
n=143 {删掉4}
n=13 {解为13}
这样,删数问题就与如何寻找递减区间首字符这样一个简单的问题对应起来了。要注意一个细节问题:可能会出现字符串首部有若干个0(甚至整个字符串都是0)的情况。按以上贪__心策略编制的程序框架如下:
输入s, n;
while s 0 do
begin
i:=1; {从串首开始找}
while (i length(n)) and (n[i]n[i+1]) do i:=i+1;
delete(n,i,1); {删除字符串n的第i个字符}
s := s – 1;
end;
while (length(n)1) and (n[1]=‘0’) do delete(n,1,1); {删去串首可能产生的无用零}
输出n;
文档评论(0)