Code & Examples 2
Knapsack Problem
#include <bits/stdc++.h>
using namespace std;
// Function untuk mencari profit maksimal dalam suatu knapsack
int knapsack(int W, vector<int> &val, vector<int> &wt) {
// Inisialisasi array dp dengan nilai awal 0
vector<int> dp(W + 1, 0);
// Mengambil setiap item, mulai dari item ke-1 hingga item ke-n
for (int i = 1; i <= wt.size(); i++) {
// Mulai dari belakang, sehingga kita juga memiliki data dari
// perhitungan sebelumnya dari i-1 item dan menghindari duplikasi
for (int j = W; j >= wt[i - 1]; j--) {
dp[j] = max(dp[j], dp[j - wt[i - 1]] + val[i - 1]);
}
}
return dp[W];
}
int main() {
vector<int> val = {1, 2, 3};
vector<int> wt = {4, 5, 1};
int W = 4;
cout << knapsack(W, val, wt) << endl;
return 0;
}
Penjelasan Program:
Kode di atas sudah bersifat optimized karena menghemat penggunaan memori dan waktu eksekusi. Analogi untuk program ini adalah sebagai berikut:
- Kita memiliki sebuah tas (knapsack) dengan kapasitas tertentu (W).
- Kita memiliki beberapa barang (items) dengan nilai (val) dan berat (wt) tertentu.
- Tujuan kita adalah mengisi tas tersebut dengan barang-barang sehingga nilai total barang di dalam tas maksimal tanpa melebihi kapasitas tas.
- Kita menggunakan pendekatan dinamis (dynamic programming) untuk menyelesaikan masalah ini dengan efisien.
- Pertama-tama, kita iterasi setiap barang, dan untuk setiap barang, kita iterasi kapasitas tas dari belakang ke depan (misal dari berat maksimum ke 0).
- Dengan cara ini, nanti kita akan cari maksimal nilai yang bisa dimasukkan ke dalam tas tanpa melebihi kapasitasnya.
- Kode tersebut sudah mencakup situasi membandingkan antara menggunakan nilai barang dengan weight tertinggi atau menambahkan nilai barang dengan weight lebih rendah dengan kapasitas tas yang lebih kecil.