算法学习——贪心算法(一)

问题一

设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 ) O(n)

问题二

设有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} , 证明该0-1背包问题可以用贪心法求解并写出该贪心算法的伪代码。
(2)请写出一个物品重量(价值)序列,使得上述贪心法无法得到最优解。

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

背包最大重量是8

未完待更

发布了13 篇原创文章 · 获赞 2 · 访问量 580

猜你喜欢

转载自blog.csdn.net/qq_43887432/article/details/105202153