Wednesday, February 6, 2019

[AtCoder] E - Knapsack 2

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : E - Knapsack 2
Source            : AtCoder Educational DP Contest
Category          : Dynamic Programing
Algorithm         : Exchange Arguments Technique
Verdict           : Accepted

  1. #include "bits/stdc++.h"  
  2.   
  3. using namespace std;  
  4.   
  5. #define ll          long long int   
  6. #define inf         (ll)1e17  
  7.   
  8. static const int maxn = 100 + 5;  
  9. static const int Max = 1e5 + 5;  
  10.   
  11. ll dp[maxn][Max];  
  12. bool memoize[maxn][Max];  
  13.   
  14. int w[maxn], val[maxn];  
  15.   
  16. int N, W;  
  17.   
  18. ll solve(int pos, int make)  
  19. {  
  20.   if (pos >= N)   
  21.   {  
  22.       if (make == 0) return 0;  
  23.       return inf;  
  24.   }  
  25.   ll &ret = dp[pos][make];  
  26.   bool &mem = memoize[pos][make];  
  27.   if (mem) return ret;  
  28.   mem = 1;  
  29.   ret = inf;  
  30.   if (make - val[pos] >= 0) ret = min(ret, w[pos] + solve(pos+1, make - val[pos]));  
  31.   ret = min(ret, solve(pos+1, make));  
  32.   return ret;  
  33. }  
  34.                                         
  35. int main()  
  36. {  
  37.     scanf("%d %d", &N, &W);  
  38.     for (int i = 0; i < N; i++) scanf("%d %d", &w[i], &val[i]);  
  39.     for (int make = 100000; make >= 0; make--)  
  40.     {  
  41.         ll ans = solve(0, make);  
  42.         if (ans <= W)   
  43.         {  
  44.             printf("%d\n", make);  
  45.             break;  
  46.         }  
  47.     }  
  48. }  

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.