算法学习——贪心算法(一)没完成

问题一

设x1, x2, …., xn是实数轴上的n个点,尝试用单位长度的闭区间覆盖这些点,设计贪心算法求解需要多少单位长度闭区间?

伪代码

sort(x)//将各点按照横坐标从小到大排序
length = getLength(x)
sum = 0
maxX = x[0] - 1
for i = 0 to length - 1
    if maxX < x[i]
        maxX = x[i] + 1
        sum++
return sum

时间复杂度是 O ( n l g n ) O(nlgn) O(nlgn)

问题二

设有n个物品,第i个物品的价值是vi、重量是wi, 假设物品可以任意分割,给定一个背包,其能容纳最大重量为C,求该背包能容纳物品的最大价值。要求写出伪代码并分析算法正确性和复杂性。

问题分析

计算物品的性价比,按照性价比从大到小排序,首先装性价比最大的物品,直到该物品全部装进去或者背包已满,对剩余物品同样。

sort(goods) //对物品按照性价比从大到小排序,即按照vi/wi排序
count = length(goods)//计算商品数量
value = 0//记录放进背包的商品价值

for i = 0 to count - 1
    if wi < C
        C -= wi
        value += vi
    else
        value += vi * C / wi
        break
return value

正确性分析

贪心选择性:如果给定背包可以盛装物品的最大价值是valueMax,除了单位容积之外的价值是value.对于背包的这个单位容积,如果不选择当前可选的性价比最大的物品vMax,而是选择了性价比更小的物品vMin,则背包价值是vMin+value,比VMax+value小,与当前盛装方案是最佳的矛盾。所以,对于单位容积,必须选择当前可以放下的性价比最大的物品。
最优子结构:反证法即可。

时间复杂性分析

排序是制约算法时间复杂性的瓶颈

问题三(别忘记写)

考虑多背包问题,即给定n个物品,其中物品i的价格是vi, 重量是wi,有m个背包,背包j最大能装物品的重量均为Bj,求这些背包能够装下物品的最大价格,其中每个物品要么完全放入背包,要么不放入。
对于此问题一个显然的贪心算法如下:利用精确算法选择物品装第一个背包,然后移除装入第一个背包的物品,然后按此方法依次装后面的背包。
(a) 证明此贪心算法不能给出精确解,在所有Bj都相等时也是如此。
(b) 证明当所有Bj都相等时,此贪心算法是一个常近似比的近似算法。

问题四

设有6种硬币,面值是1分, 2分, 5分, 1角,5角,1元,给定一个钱数n,求出一个硬币组合,要求面值总和为n且硬币个数最少,假设每种硬币个数无限。要求
写出伪代码并分析算法正确性和时间复杂性。

money[0] = 0.01
money[1] = 0.02
money[2] = 0.05
money[3] = 0.1
money[4] = 0.5
money[5] = 1
sum = 0
while n != 0
    for i = 5 downto 0
        if n >= money[i]
            n -= money
            sum++
            break
return sum

问题五(第二问)

给定一个城市集合,一些城市之间由高速公路连接,这些城市和城市之间的高速公路构成了一个无向图G = (V, E),每条边e=(u, v)E表示一条城市u到v的高速公路,e上的权重le表示该高速公路的长度。一辆车需要从城市s到达城市t,但该车的油箱存油最多能走L公里,每个城市有一个加油站,但是城市之间没有加油站,因此,只有当le<L的时候,才能走e对应的高速公路。回答下列问题:
(1) 设计一个时间复杂性O(E)的算法,判定是否这辆车能够从城市s走到城市t。
(2) 如果准备买一辆新车,需要知道保证车从城市s成功走到城市t最少要用多大的油箱,请设计时间复杂性为O((|V | + |E|) log |V |)的算法解决该问题。

分析

  1. 直接bfs搜索即可。可以通行的路满足耗油小于等于油箱存油,并且没走过。
  2. 不会,待更

问题六

考虑特殊的0-1背包问题:有n个物品,每个物品i价值和重量都是wi,背包能容纳物品的最大重量是C, 选择背包能容纳的物品集合,使得这些物品价值之和最大。回答下列问题:
(1)若物品的重量(价值)分别是1, 2, …, 2 n − 1 2^{n-1} 2n1, 证明该0-1背包问题可以用贪心法求解并写出该贪心算法的伪代码。
(2)请写出一个物品重量(价值)序列,使得上述贪心法无法得到最优解。

  1. 贪心选择性:每次选择可以装下并且物品重量最大的。
    对于一个可盛装的最大重量为C的背包,方案A构成了最优解,其中一定包含重量小于等于C的重量最大的物品,其重量为 2 k 2^{k} 2k 2 k + 1 > C 2^{k+1}>C 2k+1>C,如果不包含这个物品,选择 ∑ i = 0 k − 1 2 i \sum_{i=0}^{k-1}2^i i=0k12i,其值小于 2 k 2^k 2k不是最优选择,所以具有贪心选择性
    优化子结构:对于一个最优解A,去掉贪心选出来的物品good,构成的选择方案是针对子问题的最优解 B 1 B_1 B1,如果不是,则选择子问题的最优解 B 2 B_2 B2,则 B 2 B_2 B2和good构成的解比A更优,与A是最优解矛盾。所以该问题有最优子结构。
重量348
价值555

背包最大重量是8

未完待更

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值