CCCPaste

57b86f270c46f

#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <cstring>
#include <map>
using namespace std;
typedef long long ll;
const int maxn = 100 + 10;
const ll INF = 2e17;
int n;
int weights[maxn], values[maxn];
ll dp[maxn][100005];
ll rec(int at, int weight_capacity) {
if(at >= n) {
return 0;
}

if(dp[at][weight_capacity] != -1) {
return dp[at][weight_capacity];
}

ll res = -INF;

res = max(res, rec(at + 1, weight_capacity));

if(weight_capacity >= weights[at]) {
res = max(res, rec(at + 1, weight_capacity - weights[at]) + values[at]);
}

dp[at][weight_capacity] = res;
return res;
}
int main() {

memset(dp, -1, sizeof dp);
int W;
cin >> n >> W;

for(int i = 0; i < n; i++) {
cin >> weights[i] >> values[i];
}

cout << rec(0, W) << endl;
return 0;
}