1.a Tentu, berikut adalah perhitungan manual menggunakan metode Brute Force untuk masalah knapsack yang Anda berikan:
Dengan kapasitas knapsack �=6W=6, dan nilai-nilai bobot (�w) dan keuntungan (�b) sebagai berikut:
�=4�1=3.5,�1=7�2=2.5,�2=5�3=5,�3=10�4=4.5,�4=8nw1w2w3w4=4=3.5,b1=7=2.5,b2=5=5,b3
=10=4.5,b4=8
Kita perlu mencoba semua kombinasi dari 4 barang tersebut, yaitu:
1. Tidak mengambil barang sama sekali (keuntungan = 0) 2. Mengambil barang 1 saja (keuntungan = 7)
3. Mengambil barang 2 saja (keuntungan = 5) 4. Mengambil barang 3 saja (keuntungan = 10) 5. Mengambil barang 4 saja (keuntungan = 8)
6. Mengambil barang 1 dan 2 (keuntungan = 7 + 5 = 12, tetapi bobot = 3.5 + 2.5 = 6, melebihi kapasitas knapsack)
7. Mengambil barang 1 dan 3 (keuntungan = 7 + 10 = 17, tetapi bobot = 3.5 + 5 = 8.5, melebihi kapasitas knapsack)
8. Mengambil barang 1 dan 4 (keuntungan = 7 + 8 = 15, tetapi bobot = 3.5 + 4.5 = 8, melebihi kapasitas knapsack)
9. Mengambil barang 2 dan 3 (keuntungan = 5 + 10 = 15, tetapi bobot = 2.5 + 5 = 7.5, melebihi kapasitas knapsack)
10. Mengambil barang 2 dan 4 (keuntungan = 5 + 8 = 13, bobot = 2.5 + 4.5 = 7, tidak melebihi kapasitas knapsack)
11. Mengambil barang 3 dan 4 (keuntungan = 10 + 8 = 18, tetapi bobot = 5 + 4.5 = 9.5, melebihi kapasitas knapsack)
Dari semua kombinasi tersebut, kombinasi yang memberikan keuntungan maksimum adalah mengambil barang 2 dan 4, dengan keuntungan total 13 dan bobot total 7 (tidak melebihi kapasitas knapsack).
1.b
def knapSack(W, w, val, n):
if n == 0 or W == 0:
return 0
if w[n-1] > W:
return knapSack(W, w, val, n-1)
else:
return max(val[n-1] + knapSack(W-w[n-1], w, val, n-1), knapSack(W, w, val, n-1))
# Input nilai-nilai W = 6
n = 4 # Jumlah total barang, bukan indeks terakhir w = [3.5, 2.5, 5, 4.5]
val = [7, 5, 10, 8]
# Memanggil fungsi knapSack dan mencetak hasilnya
result = knapSack(W, w, val, n) # Menggunakan jumlah total barang print("Keuntungan maksimum:", result)
2.a. Mengurutkan elemen-elemen secara manual menggunakan metode Divide and Conquer:
Langkah-langkah pengurutan dengan Divide and Conquer:
1. Membagi tabel menjadi dua bagian yang sama panjang (jika panjang ganjil, salah satu bagian akan memiliki satu elemen lebih banyak): Tabel: [5, 12, 3, 9, 1, 20, 7, 2] Bagian kiri: [5, 12, 3, 9]
Bagian kanan: [1, 20, 7, 2]
2. Mengurutkan masing-masing bagian secara terpisah menggunakan metode Divide and Conquer: Bagian kiri: [5, 12, 3, 9] -> [3, 5, 9, 12] Bagian kanan: [1, 20, 7, 2] -> [1, 2, 7, 20]
3. Menggabungkan kedua bagian yang sudah terurut menjadi satu tabel terurut: [3, 5, 9, 12] dan [1, 2, 7, 20] Tabel terurut: [1, 2, 3, 5, 7, 9, 12, 20]
Jadi, urutan elemen-elemen dalam tabel setelah diurutkan secara ascending (menaik) dengan metode Divide and Conquer adalah: [1, 2, 3, 5, 7, 9, 12, 20].
2.b def merge_sort(arr):
if len(arr) > 1:
mid = len(arr) // 2 left_half = arr[:mid]
right_half = arr[mid:]
merge_sort(left_half) merge_sort(right_half)
i = j = k = 0
while i < len(left_half) and j < len(right_half):
if left_half[i] < right_half[j]:
arr[k] = left_half[i]
i += 1 else:
arr[k] = right_half[j]
j += 1 k += 1
while i < len(left_half):
arr[k] = left_half[i]
i += 1 k += 1
while j < len(right_half):
arr[k] = right_half[j]
j += 1 k += 1
def print_array(arr):
for i in range(len(arr)):
print(arr[i], end=" ") print()
# Tabel awal
arr = [5, 12, 3, 9, 1, 20, 7, 2]
print("Tabel sebelum diurutkan:") print_array(arr)
# Mengurutkan menggunakan merge sort merge_sort(arr)
print("\nTabel setelah diurutkan secara ascending:") print_array(arr)