Advertisement
pdpd123

0/1 knapsack

Sep 16th, 2019
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.73 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4.  
  5. int v[1010], w[1010], dp[1010];
  6. bool bac[1010][1010];
  7.  
  8. signed main(){
  9.     int n, W;
  10.     cin >> n >> W;
  11.     for(int i=0;i<n;i++) cin >> w[i] >> v[i];
  12.    
  13.     // dynamic programming
  14.     for(int i=0;i<n;i++){
  15.         for(int j=W;j>=0;j--){
  16.             if(j-w[i] >= 0){
  17.                 if(dp[j-w[i]]+v[i] > dp[j])
  18.                     dp[j] = dp[j-w[i]]+v[i], bac[i][j] = true;
  19.             }
  20.         }
  21.     }
  22.     cout << dp[W] << endl;
  23.    
  24.     // backtracking
  25.     int i = n-1, j = W;
  26.     while(i >= 0 && j >= 0){
  27.         if(bac[i][j] == true){
  28.             cout << i << ' ';
  29.             j-=w[i], i--;
  30.         }
  31.         else i--;
  32.     }
  33.     cout << endl;
  34. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement