laporan paal

9
Nama : Ardhiansyah Baskara NRP : 5111100088 Kelas : B Laporan PAAL Dynamic Programming 1. Coin Row Problem a. Penjelasan Coin row problem adalah sebuah permasalahan yang diberikan n koin dengan nilai integer positif c1, c2,…, cn yang tidak harus berbeda-beda satu sama lain nilainya. Tujuan dari permasalahan ini adalah untuk mengambil nilai maksimum dari total koin yang diberikan dengan batasan bahwa tidak ada koin yang berurutan dari koin-koin yang diambil. Running time dari algoritma ini adalah Θ(n). b. Algoritma c. Source Code void CoinRow(int* C, int n) { int F[n+1], whichMax[n+1], beforeIndex, beforeValue; F[0] = 0; F[1] = C[0]; for(int i=2; i<=n; i++) { beforeIndex = F[i-1]; beforeValue = C[i-1] + F[i-2]; if(beforeValue >= beforeIndex) { F[i] = beforeValue; whichMax[i] = i-2; } else { F[i] = beforeIndex; whichMax[i] = i-1; } }

Upload: ardhiansyah-baskara

Post on 22-Oct-2015

25 views

Category:

Documents


0 download

DESCRIPTION

Coin Row, Change Making, Coin Collection

TRANSCRIPT

Page 1: Laporan PAAL

Nama : Ardhiansyah Baskara NRP : 5111100088 Kelas : B

Laporan PAAL

Dynamic Programming

1. Coin Row Problem

a. Penjelasan

Coin row problem adalah sebuah permasalahan yang diberikan n koin dengan nilai integer positif c1, c2,…, cn yang tidak harus berbeda-beda satu sama lain nilainya. Tujuan dari permasalahan ini adalah untuk mengambil nilai maksimum dari total koin yang diberikan dengan batasan bahwa tidak ada koin yang berurutan dari koin-koin yang diambil. Running time dari algoritma ini adalah Θ(n).

b. Algoritma

c. Source Code

void CoinRow(int* C, int n)

{

int F[n+1], whichMax[n+1], beforeIndex, beforeValue;

F[0] = 0;

F[1] = C[0];

for(int i=2; i<=n; i++)

{

beforeIndex = F[i-1];

beforeValue = C[i-1] + F[i-2];

if(beforeValue >= beforeIndex)

{

F[i] = beforeValue;

whichMax[i] = i-2;

}

else

{

F[i] = beforeIndex;

whichMax[i] = i-1;

}

}

Page 2: Laporan PAAL

Nama : Ardhiansyah Baskara NRP : 5111100088 Kelas : B

stack<int> coins;

int bt = n;

while(bt!=0 && bt!=1)

{

if(bt - whichMax[bt]==2)

{

coins.push(C[bt-1]);

}

bt = whichMax[bt];

}

if(bt==1) coins.push(C[bt-1]);

cout << "Maximum amount of coins: " << F[n] << endl;

cout << "Consist of ";

while(!coins.empty())

{

cout << "[" << coins.top() << "]";

coins.pop();

}

cout << endl;

}

d. Contoh Test Case

Page 3: Laporan PAAL

Nama : Ardhiansyah Baskara NRP : 5111100088 Kelas : B

Dari contoh yang ada di buku seperti tampak di atas diberikan sebuah daftar koin dengan nilai 5, 1, 2, 10, 6, 2. Kemudian setelah dijalankan di dalam program, akan menghasilkan seperti gambar di bawah.

Untuk mendapatkan coin mana saja yang diambil adalah dengan menyimpan nilai-nilai mana saja yang diambil dengan backtrack dari paling belakang. Seperti contoh di atas adalah diambil terlebih dahulu dari nilai 17 didapatkan dari 2 + 15, dimana yang berupa koin tunggal adalah 2, sehingga 2 diambil. Kemudian mundur lagi bahwa nilai 15 nya didapatkan dari 10 + 5 dan pembentuknya adalah dengan koin tunggal dengan nilai 10, sehingga koin dengan nilai 10 diambil. Kemudian mundur lagi bahwa nilai 5 nya didapatkan dari F[1] = c1 yakni 5, sehingga koin dengan nilai 5 diambil. Dari sini sehingga dihasilkan koin dengan nilai 5, 10 dan 2.

Page 4: Laporan PAAL

Nama : Ardhiansyah Baskara NRP : 5111100088 Kelas : B

2. Change Making a. Penjelasan

Change making adalah sebuah permasalahan dimana diberikan sebuah list koin d1, d2, … dm yang digunakan untuk pengembalian sebuah transaksi bernilai m dengan syarat bahwa dengan nilai yang akan dikembalikan hanya membutuhkan koin dengan jumlah paling sedikit. Algoritma ini lebih cepat daripada menggunakan greedy technique yang dikenal pada umumnya. Running time untuk algoritma ini adalah O(nm).

b. Algoritma

c. Source Code

void ChangeMaking(int* D, int m, int n)

{

int F[n+1], j, temp, whichMin[n+1];

F[0] = 0;

for(int i=1; i<=n ; i++)

{

temp = INFINITY;

j = 0;

while(j<m)

{

if(F[i-D[j]] <= temp && i >= D[j])

{

temp = F[i-D[j]];

whichMin[i] = D[j];

}

j++;

}

F[i] = temp + 1;

}

int total = n;

Page 5: Laporan PAAL

Nama : Ardhiansyah Baskara NRP : 5111100088 Kelas : B

stack<int> coins;

while(total>0)

{

coins.push(whichMin[total]);

total -= whichMin[total];

}

cout << "Minimum amount of coins: " << F[n] << endl;

cout << "Consist of ";

while(!coins.empty())

{

cout << "[" << coins.top() << "]";

coins.pop();

}

cout << endl;

}

d. Contoh Test Case

Dari contoh test case yang ada di buku seperti gambar di atas adalah diberikan sebuah nilai 6 untuk dikembalikan dengan menggunakan koin dengan masing-masing nilai adalah 1, 3 dan 4. Kemudian jika dijalankan pada program akan menghasilkan seperti gambar di bawah.

Page 6: Laporan PAAL

Nama : Ardhiansyah Baskara NRP : 5111100088 Kelas : B

Kemudian untuk mendapatkan koin berapa saja yang bisa diambil maka dilakukan backtracking. Dari proses di atas dimulai dari n = 6, maka di F[6] akan didapatkan nilai minimum dari F[6 - 3] = F[3] yang bernilai 1 daripada F[6-1] = F[5] = 2 ataupun F[6-4] = F[2] = 2. Sehingga koin pertama adalah 3. Kemudian lanjut dengan pengurangan n – 3 = 3 sehingga pada F[3] nilai minimum didapatkan dari F[3-3] = F[0] yang bernilai 0 daripada F[3-1] = F[2] = 2. Sehingga koin kedua yang didapatkan adalah 3. Dan hasil akhirnya adalah 2 koin bernilai 3.

3. Coin Collecting Problem a. Penjelasan

Coin Collecting Problem adalah sebuah problem dimana diberikan sebuah papan dengan ukuran n x m yang berisi koin-koin di masing-masing cell nya dan nilainya tidak lebih dari 1. Sebuah robot diletakkan di pojok kiri atas untuk inisialisasi, kemudian akan berjalan hingga menuju bagian di pojok kanan bawah dengan syarat robot hanya bisa berjalan kanan dan bawah. Tujuan akhir dari problem ini adalah mendapatkan koin sebanyak-banyaknya dengan syarat yang disebutkan sebelumnya. Running time dari algoritma ini adalah Θ(nm).

b. Algoritma

Page 7: Laporan PAAL

Nama : Ardhiansyah Baskara NRP : 5111100088 Kelas : B

c. Source Code

void CoinCollection(int C[][5], int n, int m)

{

int F[n][m], top, left;

map<coor,coor> parent;

for(int i=0; i<n; i++)

for(int j=0; j<m; j++)

parent[make_pair(i,j)] = make_pair(i,j);

parent[make_pair(0,0)] = make_pair(-1,-1);

F[0][0] = C[0][0];

for(int j=1; j<m; j++)

{

F[0][j] = F[0][j-1] + C[0][j];

parent[make_pair(0,j)] = make_pair(0,j-1);

}

for(int i=1; i<n; i++)

{

F[i][0] = F[i-1][0] + C[i][0];

parent[make_pair(i,0)] = make_pair(i-1,0);

for(int j=1; j<m; j++)

{

top = F[i-1][j];

left = F[i][j-1];

if(top >= left)

{

F[i][j] = top + C[i][j];

parent[make_pair(i,j)] = make_pair(i-1,j);

}

else

{

F[i][j] = left + C[i][j];

parent[make_pair(i,j)] = make_pair(i,j-1);

}

}

}

stack<coor> path;

coor backtrack;

int k = n-1;

int l = m-1;

while(k!=-1 || l!=-1)

{

path.push(make_pair(k,l));

backtrack = parent[make_pair(k,l)];

k = backtrack.first;

l = backtrack.second;

}

cout << "Maximum amount of coins: " << F[n-1][m-1] << endl;

cout << "The path is ";

while(!path.empty())

{

cout << "(" << path.top().first << "," << path.top().second

<< ")";

Page 8: Laporan PAAL

Nama : Ardhiansyah Baskara NRP : 5111100088 Kelas : B

path.pop();

}

cout << endl;

}

d. Contoh Test Case

Dari contoh test case di buku seperti gambar di atas, maka akan didapatkan koin dengan nilai maksimum 5. Seperti tampak di bawah ini jika dijalankan dengan program.

Untuk mendapatkan path tersebut, maka harus dilakukan backtracking dari koordinat paling akhir, yakni 5,6. Dari sana kemudian dicari blok di sebelah manakah antara atas dan kirinya

Page 9: Laporan PAAL

Nama : Ardhiansyah Baskara NRP : 5111100088 Kelas : B

yang nilainya lebih besar dilihat dari nilai akumulasi. Jika 5,6 nilainya 5 maka diambil lah blok 4,6 karena nilainya adalah 5 dan lebih besar daripada blok 5,5 yang nilainya hanya 4. Begitu seterusnya hingga kembali lagi ke pojok kiri atas atau koordinat semula sebelum robot berjalan. Sehingga didapatkan path (1,1)(1,2)(2,2)(2,3)(2,4)(3,4)(3,5)(3,6)(4,6)(5,6).