問題二問題三(別忘記寫)
問題四問題五(第二問)
問題六設x1, x2, …., xn是實數軸上的n個點,嘗試用單位長度的閉區間覆蓋這些點,設計貪心演算法求解需要多少單位長度閉區間?
sort
(x)//將各點按照橫座標從小到大排序
length =
getlength
(x)sum =
0maxx = x[0]
-1for i =
0 to length -
1if maxx < x[i]
maxx = x[i]+1
sum++
return sum
時間複雜度是o(n
lgn)
o(nlgn)
o(nlgn
) 設有n個物品,第i個物品的價值是vi、重量是wi, 假設物品可以任意分割,給定乙個揹包,其能容納最大重量為c,求該揹包能容納物品的最大價值。要求寫出偽**並分析演算法正確性和複雜性。
計算物品的價效比,按照價效比從大到小排序,首先裝價效比最大的物品,直到該物品全部裝進去或者揹包已滿,對剩餘物品同樣。
sort
(goods)
//對物品按照價效比從大到小排序,即按照vi/wi排序
count =
length
(goods)
//計算商品數量
value =
0//記錄放進揹包的商品價值
for i =
0 to count -
1if 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]
=1sum =
0while n !=
0for 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直接bfs搜尋即可。可以通行的路滿足耗油小於等於油箱存油,並且沒走過。
不會,待更
考慮特殊的0-1揹包問題:有n個物品,每個物品i價值和重量都是wi,揹包能容納物品的最大重量是c, 選擇揹包能容納的物品集合,使得這些物品價值之和最大。回答下列問題:
(1)若物品的重量(價值)分別是1, 2, …,2n−
12^
2n−1
, 證明該0-1揹包問題可以用貪心法求解並寫出該貪心演算法的偽**。
(2)請寫出乙個物品重量(價值)序列,使得上述貪心法無法得到最優解。
貪心選擇性:每次選擇可以裝下並且物品重量最大的。
對於乙個可盛裝的最大重量為c的揹包,方案a構成了最優解,其中一定包含重量小於等於c的重量最大的物品,其重量為2k2^
2k則2 k+
1>
c2^>c
2k+1
>
c,如果不包含這個物品,選擇∑i=
0k−1
2i
\sum_^2^i
∑i=0k−
12i
,其值小於2
k2^k
2k不是最優選擇,所以具有貪心選擇性
優化子結構:對於乙個最優解a,去掉貪心選出來的物品good,構成的選擇方案是針對子問題的最優解b
1b_1
b1,如果不是,則選擇子問題的最優解b
2b_2
b2,則b
2b_2
b2和good構成的解比a更優,與a是最優解矛盾。所以該問題有最優子結構。重量3
48價值5
55揹包最大重量是8
未完待更
演算法學習 貪心演算法
所謂貪心演算法,是在對問題求解時,總是做出在當前看來最好的選擇。即,不從整體最優上加以考慮,它所做出的僅僅是在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,就是某個狀態以前的過程不會影響以後的狀態,只與當前的狀態有關。貪心...
演算法學習 貪心演算法
想通過這篇部落格來分享一下學習貪心演算法和動態規劃的過程 首先什麼是貪心演算法?翻譯 話就是用簡單粗暴的方式,以最少的代價 占用的時間和空間 得出結果。比如某麵包店有a b c三種大小的麵包,其中a麵包可以提供10點能量售價5元,b麵包可以提供8點能量售價3元,c麵包可以提供2點能量售價1元。現在有...
貪心演算法學習
基本概念 所謂貪心演算法是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的區域性最優解。貪心演算法沒有固定的演算法框架,演算法設計的關鍵是貪心策略的選擇。必須注意的是,貪心演算法不是對所有問題都能得到整體最優解,選擇的貪心策略必須具備...