Para Bozdurma Sorusu

advertisement
Algoritmalar
Ders
II
7
Açgözlü
Algoritmalar
1
GREEDY ALGORITHMS
PARA BOZDURMA SORUSU
SORU

N lira para ve her birinden yeterli miktarda x1,
x2,…,xk birimlik bozuk paralar veriliyor. N ve
x1, x2,…xk sayıları pozitif tam sayılardır.
Amacımız N lira parayı toplam bozuk para sayısı
en az olacak biçimde bozdurmaktır.
SORUNUN MATEMATIKSEL IFADESI
Yani öyle a1, a2,…ak negatif olmayan tam
sayılarını bulmak gerekir ki
 N=a1.x1+a2.x2+…ak.xk
 ve a1+a2+…ak toplamı en az olsun.

AÇGÖZLÜ ALGORITMA?

Bu soruyu çözmek için açgözlü (greedy) algoritma
uygulanabilir mi?
Yani önce S={x1, x2,…xk} kümesinin mümkün
olabilecek en büyük elemanını mümkün
olabilecek sayıda kullanırız. Sonra da N in artan
kısmına aynı algoritmayı tekrar tekrar
uygularız.
AÇGÖZLÜ ALGORITMA?
S={x1, x2,…xk}={1, 4, 5, 10} ve N=8 olursa
Açgözlü algoritmaya göre önce 5, sonra 3 tane 1
alınır, yani N=5+1+1+1 bulunur. Bu durumda 4
bozuk para bulunur.
 Oysaki N=4+4 optimal çözümdür, yani 2 bozuk
para ile 8 lirayı bozabiliriz.
 Yani Açgözlü algoritma çalışmaz

DINAMIK PROGRAMLAMA
 1.
adım. Optimal çözümün yapısını
karakterize etme
 Optimal çözüm
N=a1.x1+a2.x2+…an.xn+…ak.xk olsun.
Bu çözümü her hangi bir bozuk paraya
göre iki parçaya ayırdığımızda, örneğin,
b=a1.x1+…an.xn ve diğer parça da N-b
olduğunda b lira paranın bozuk paralara
optimal ayrılışı b=a1.x1+…an.xn
olacaktır.
Aynısı N-b için de geçerlidir.
ISPAT
b nin bozuk paralara ayrılışı daha az sayıda
bozuk para ile mümkün olsaydı
 N=b+N-b sayısının da bozuk paralara ayrılışı
daha az sayıda bozuk para ile yapılabilirdi, bu ise
 N=a1.x1+a2.x2+…ak.xk ayrılışının optimal
olması ile çelişmektedir

OPTIMAL ÇÖZÜMÜN DEĞERI IÇIN
FORMÜL
2. adım. Optimal Çözümün değeri için
özyinelemeli (rekursive) formül bulunması
 C[p] ile p lira paranın optimal bozulması için
gerekli olan bozuk para sayısını işaret edelim.
xi<=p koşuluna uyan
 ve p lira paranın optimal bozulmasında
kullanılan ilk bozuk para birimi xi olsun.

OPTIMAL ÇÖZÜMÜN DEĞERI IÇIN
FORMÜL
 1.
adıma göre p-xi lira para da optimal
bozulmuş olur. Yani
 C[p]=1+C[p-xi] olur.
 Biz xi nin kaç olduğunu bilmiyoruz ama k
tane i için tüm durumlara bakabiliriz.
 C[p]= 0,
eğer p=0 ise,
min {1+C[p-xi] }, eğer p>0 ise
1<=i<=k
xi<=p
OPTIMAL ÇÖZÜMÜN DEĞERININ
HESAPLANMASI
3. adım. Optimal Çözümün değerlerini aşağıdan
yukarıya doğru hesaplayabiliriz.
 Aşağıdaki sözde kodda x bozuk para birimleri
dizisini, k bu dizinin eleman sayısını, n ise
bozulması gereken para değerini göstermektedir

SÖZDE KOD
Change(x, k, n)
 1 C[0] ← 0
 2 for p ← 1 to n
3
min ← ∞
4
for i ← 1 to k
5
if x[i] <= p then
6
if 1 + C[p − x[i]] < min then
7
min ← 1 + C[p − x[i]]
8
coin ← i
9
C[p] ← min
 10
S[p] ← coin
 11 return C and S

HESAPLANAN DEĞERLERDEN
OPTIMAL ÇÖZÜMÜN
OLUŞTURULMASI
4. adım
Make-Change(S, x, n)
1 while n > 0
2 Print S[n]
3 n ← n − x[S[n]]
Download