算法设计与分析第四章——贪心算法课后习题

 答案给出的方法是(这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个 顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相应于要找的最小 会场数。)

说实话我没看懂,不过我能看懂代码的解法,就是按照最早开始时间和最晚结束时间排序,


前几题都大同小异,要么书上讲的类似,我就略过了

也就是说从叶子结点开始,每往上走d的路长,就要分出一颗子树, 不如先把这个树构造出来再划分,那么一部分代码是构造树就不看了,另一部分是从叶子结点往上走,

说实话我挺佩服他们写代码不加注释也不解释函数作用的写法,真的牛批 ,你像第一题的leftend鬼知道什么意思?


(这题我记得我做过) 

类似会场安排问题,但是设置了惩罚。而且每次只能完成一个任务,要使得惩罚最小,我们可以把它看作一个类似01背包问题的题目,每个任务的乘法比上所耗费的时间就是它的性价比,如果性价比相同我们应尽量选择耗时小的,同时这样寻找最优结构的方法我们也想到了动态规划中的最优子结构的方法,构建一个矩阵记录最小代价。

 

 


这题和哈夫曼算法类似,但是不是选择两堆,而是选择最小的n堆进行合并,最多k堆。思想还是一样的,我们可以将这串序列进行排序,那么肯定是合并次数越小,总费用越小,反之次数越大总费用越大,因此最小费用需要每次都选k堆且贪心算法每次选最小的k堆,而最大费用需要贪心算法每次选两个最大的堆合并。


 

假设n可以拆分成a+b,要求ab最大值,n2=a2+2ab+b2,n2-(a2+b2)=2ab,两边同时加上2ab得n2-(a2-2ab+b2)=n2-(a-b)2=4ab,n不变,a-b的绝对值越小,ab越小,反之 a-b的绝对值越大,ab越大。因此对于每一个可以拆分的因数我们都要保证a-b的绝对值尽可能小,且拆分出来的a和b!=1(另外由于2ab<=a2+b2当且仅当a=b取到最大值也能说明这一点)。比如10=5+5,绝对值5-5=0,5可以拆分成3+2,3-2=1.10=3+2+5,最大乘积就是3*2*5=30(相同的数字只出现一次)

 例题用贪心算法,从2开始依次从n中拆出自然数,使得乘积尽可能大,a[k]数组代表第几个因数,其值代表这个因数的数值,直到n<=a[k]则说明剩下的n不够提取更大的自然数了,如果n==a[k]则说明分成两个一样的因数了,所以一个要+1,一个要-1。若n<a[k],那剩下的n也拆分不了,因为小于a[k]即使拆了肯定重复了,那就把剩下的n全部加到a[k]里面去。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值