Advertisement
dbarshan

0-1 Knapsack DP

Mar 28th, 2019
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.73 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4.  
  5. int cache[100][100] = {0};
  6.  
  7. int knapsack_DP(int W, int wt[], int val[], int n){
  8.    
  9.     int K[W+1][n+1] = {0};
  10.     for(int i=0; i<=W; i++){
  11.         for(int j=0; j<=n; j++){
  12.             if(i==0 || j == 0)
  13.                 K[i][j] = 0;
  14.             else{
  15.                 if(wt[j-1] > i)
  16.                     K[i][j] = K[i][j-1];
  17.                 else{
  18.                     int taken = val[j-1] + K[i-wt[j-1]][j-1];
  19.                     int not_taken = K[i][j-1];
  20.                     K[i][j] = std::max(taken,not_taken);
  21.                 }
  22.             }
  23.         }
  24.     }
  25.     return K[W][n];
  26. }
  27.  
  28. int knapsack_cache(int W, int wt[], int val[], int n){
  29.    
  30.     if(n==0 || W == 0)
  31.         return 0;
  32.  
  33.     if(wt[n-1] > W){
  34.         if(cache[W][n-1] == -1)
  35.             cache[W][n-1] = knapsack_cache(W,wt,val,n-1);
  36.         return cache[W][n-1];
  37.     }
  38.  
  39.     if(cache[W-wt[n-1]][n-1]==-1){
  40.         cache[W-wt[n-1]][n-1] = knapsack_cache(W-wt[n-1], wt, val, n-1);
  41.        
  42.     }
  43.     int taken = val[n-1] + cache[W-wt[n-1]][n-1];
  44.     if(cache[W][n-1] == -1){
  45.         cache[W][n-1] = knapsack_cache(W, wt, val, n-1);
  46.     }
  47.     int not_taken = cache[W][n-1]; 
  48.     return std::max(taken, not_taken); 
  49. }
  50.  
  51. int knapsack_recur(int W, int wt[], int val[], int n){
  52.  
  53.     if(n==0 || W == 0)
  54.         return 0;
  55.  
  56.     if(wt[n-1] > W)
  57.         return knapsack_recur(W,wt,val,n-1);
  58.  
  59.     int taken = val[n-1] + knapsack_recur(W-wt[n-1], wt, val, n-1);
  60.     int not_taken = knapsack_recur(W, wt, val, n-1);
  61.  
  62.     return std::max(taken, not_taken);
  63. }
  64.  
  65.  
  66. int main(){
  67.     int value[] = {60,100,120};
  68.     int weight [] = {10,20,30};
  69.     int W = 50;
  70.  
  71.     int n = sizeof(value)/sizeof(value[0]);
  72.     std::cout << knapsack_recur(W,weight,value,n) << std::endl;
  73.  
  74.     for(int i=0; i<W; i++){
  75.         for(int j=0; j<n; j++){
  76.             cache[i][j] = -1;
  77.         }
  78.     }
  79.  
  80.     std::cout << knapsack_cache(W,weight,value,n)<<std::endl;
  81.  
  82.     std::cout << knapsack_DP(W,weight,value,n);
  83.  
  84.     return 0;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement