mbah_bejo

Knapsack

May 5th, 2021
652
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.24 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. #define max(x,y) ((x<y) ? y : x)
  5.  
  6. int main(){
  7.     cin.tie(0); short n,k,i,j, z, batas;
  8.     vector<int> v; // untuk menyimpan ouput
  9.     cin >> n >> k; // input
  10.     short berat[k+1],harga[k+1],arr[k+1][n+1];
  11.     berat[0]=harga[0]=0; //awal berat & harga di set ke 0, karna idx yg dipakai dari 1
  12.     for (i=1;i<=k;i++) cin >> berat[i] >> harga[i];
  13.    
  14.     //reference YT Abdul Bari
  15.     for (i=0;i<=k;i++){
  16.         for(j=0;j <=n;j++){
  17.             if(j==0 || i==0) arr[i][j]=0;
  18.             else if (berat[i] <= j) arr[i][j] = max(harga[i] + arr[i-1][j-berat[i]], arr[i-1][j]);
  19.             else arr[i][j] = arr[i-1][j];
  20.         }
  21.     }
  22.     j=n; // mencari j terkecil yg bernilai = arr[k][n]
  23.     while(arr[k][j]== arr[k][n]) j--;
  24.     j++;
  25.    
  26.     for(i = k ;i>0 && j > 0; i--){  // loop mencari jumlah cara pengambilan batu
  27.         // cout <<"\n" << i << " " << j << " " << arr[i][j] << " " << arr[i-1][j];
  28.         if(arr[i][j]==arr[i-1][j]) continue;
  29.         else{
  30.             v.push_back(i);
  31.             j -= berat[i];  
  32.             // cout <<"\n"<< i << " " <<j;
  33.         }
  34.     }// di cetak dari belakang
  35.     for(i = v.size()-1 ; i >= 0; i--) cout << v[i] << endl;
  36.     return 0;
  37. }
Advertisement
Add Comment
Please, Sign In to add comment