首先證明硬幣找零問題有最優子結構,設我們有找
n 美分的問題的最優解,且知道這個最優解使用了乙個
c美分的硬幣,設這個最優解使用了
k 個硬幣,則我們認為解決這個問題的最優解要用到問題 n−
c美分且使用了 k−
1 個硬幣。很明顯,解決 n−
c 美分且使用了 k−
1 個硬幣使用了
n 美分的解,如果我們有小於 k−
1個硬幣就找了 n−
c 美分問題,則我們可以使用這個解法來代替
n 美分問題,並且少於
k個硬幣,這與最優解矛盾。
a) q=⌊
n/25⌋
,剩下 n′
=nmo
d25美分,d=
⌊n′/
10⌋,剩下d′
=n′mod10,
k=d′
/5,剩下 k′
=d′m
od5 ,其餘的全是
1 美分硬幣,總結就是每次選取最大的零錢,若面額大於選的紙幣,則可以兌換,否則選取較小的零錢,以此類推。
b) 證明略。
c) 現在有
30美分,硬幣面額是 25,
10,1 ,按照貪心演算法得到的解是 25,
1,1,
1,1,
1 ,即
6 個硬幣,實際上應該是 3個
10 美分的硬幣才是最優解。
d) 由最開始的證明可知找零問題有最優子結構,所以可以用動態規劃來做。 設 j
美分的錢用了 c[
j]個硬幣來找零,現在有面值分別為 d1
,d2,
...,
dk的零錢,且存在
1 美分的硬幣。若
j美分使用了乙個面額為 di
的硬幣,則有 c[
j]=1
+c[j
−di]
,對所有 j≤
0 有 c[
j]=0
。 c[
j]=if j≤0
if j > 1
compute-change(n, d, k)
let c[1..n] and denom[1..n] be new arrays
for j = 1
to n
c[j] = ∞
for i = 1
to k
if j≥di and
1 + c[j-di] < c[j]
c[j] = 1 + c[j-di]
denom[j] = di
return c and denom
give-change(j, denom)
if j > 0
give one coin of denomination denom[j]
give-change(j-denom[j], denom)
附上執行**
#include
#include
using
std::cout;
using
std::endl;
void give_change(int *denom,int j)
}void compute_change(int *d,int n,int value)//n個硬幣面額的陣列和需要找零的面值value}}
give_change(denom,value);
delete c;
delete denom;
}int main()
; std::sort(d,d+3);
compute_change(d,3,value);
return
0;}
a) 先對任務集合按照完成時間長度排序,完成時間越小排在越前面。排序之後是 p1
≤p2≤
...≤
pn。然後依次選擇這些任務排程。ca
vg=(
p1+(
p1+p
2)+.
..+(
p1+p
2+..
.+pn
))/n
。排序時間是 o(
nlgn)
。所以是 o(
nlgn)
的複雜度。
b) 採用最短剩餘時間排程演算法(shortest remaining time first(srtf))。執行時間是 o(
nt) 。
答案略
CLRS第十章思考題
未排序的單鏈表 已排序的單鏈表 未排序的雙向鍊錶 已排序的雙向鍊錶 search l,k o n o n o n o n insert l,x o 1 o n o 1 o n delete l,x o n o n o 1 o 1 successor l,x o 1 o 1 o 1 o 1 prede...
CLRS第五章思考題
a 設在第 j 次增加時,計數器為 i,表示 ni 若計數器增加,則值增加 ni 1 n i 概率為 1 ni 1 ni 因此有 e xj 0 pr 1 pr 0 1 1ni 1 n i 1 n i 1 ni 1ni 1 ni 1 執行一次的期望為 1,執行 n 次的期望為 n。b 一次增加的方差 ...
第十六章 tcp wrappers
在伺服器向外提供的tcp服務上包裝一層安全檢測機制。外來連線請求首先通過這個安全檢測,獲得安全認證後才可被系統服務接受。hosts.allow hosts.deny 在配置檔案中為各服務分別定義訪問控制規則實現訪問控制,檔案中的規則是即時生效的。配置檔案語法 1 daemon list client...