fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. // Fungsi Knapsack 0/1 menggunakan Pemrograman Dinamis
  8. int knapsack(int W, const vector<int>& weights, const vector<int>& values, int n) {
  9. // Tabel DP: dp[i][w] = nilai maksimum dengan i item dan kapasitas w
  10. vector<vector<int>> dp(n + 1, vector<int>(W + 1, 0));
  11.  
  12. for (int i = 1; i <= n; i++) {
  13. int w_i = weights[i - 1]; // Berat item saat ini
  14. int v_i = values[i - 1]; // Nilai item saat ini
  15. for (int w = 1; w <= W; w++) {
  16. // Default: tidak memasukkan item (nilai dari baris sebelumnya)
  17. dp[i][w] = dp[i - 1][w];
  18.  
  19. // Jika item muat, bandingkan dengan memasukkannya
  20. if (w_i <= w) {
  21. dp[i][w] = max(dp[i][w], v_i + dp[i - 1][w - w_i]);
  22. }
  23. }
  24. }
  25. return dp[n][W]; // Nilai maksimum total
  26. }
  27.  
  28. // Pengujian Singkat
  29. int main() {
  30. // Data Uji Coba:
  31. vector<int> values = {60, 100, 120}; // Nilai
  32. vector<int> weights = {10, 20, 30}; // Berat
  33. int W = 50; // Kapasitas
  34. int n = values.size(); // Jumlah Item
  35.  
  36. cout << "Kapasitas Knapsack (W): " << W << endl;
  37.  
  38. // Hitung dan tampilkan hasilnya
  39. int max_value = knapsack(W, weights, values, n);
  40.  
  41. cout << "Nilai Maksimum: **" << max_value << "**" << endl;
  42. // Hasilnya 220, dari item (100/20) dan (120/30). Total berat 50.
  43.  
  44. return 0;
  45. }
Success #stdin #stdout 0.01s 5316KB
stdin
5
5 4 7 8 10
10 5 7 12 8
20
stdout
Kapasitas Knapsack (W): 50
Nilai Maksimum: **220**