Pagini recente » Cod sursa (job #1469782) | Cod sursa (job #437989) | Cod sursa (job #1469783) | Cod sursa (job #894992) | Cod sursa (job #2522650)
#include <vector>
#include <iostream>
using namespace std;
int knapsack_2D(vector<int>& w, vector<int>& v, int T) {
// cout << "Knapsack 2D\n";
vector<vector<int>> dp(w.size() + 1, vector<int>(T+1));
for (int i = 1; i <= w.size(); i++) {
for (int j = 1; j <= T; j++) {
if (j - w[i] >= 0) {
dp[i][j] = max(dp[i-1][j - w[i]] + v[i], dp[i-1][j]);
} else {
dp[i][j] = dp[i-1][j];
}
}
}
// cout << "Max value: " << dp[w.size()][T] << endl << endl;
return dp[w.size()][T];
}
int knapsack_2D_opt(vector<int>& w, vector<int>& v, int T) {
// cout << "Knapsack 2D optimized\n";
// we only need the last 2 rows
vector<vector<int>> dp(2, vector<int>(T+1));
int now = 1, prev = 0;
// dp[prev][w[0]] = v[0];
for (int i = 0; i < w.size(); i++) {
for (int j = 1; j <= T; j++) {
if (j - w[i] >= 0) {
dp[now][j] = max(dp[prev][j - w[i]] + v[i], dp[prev][j]);
} else {
dp[now][j] = dp[prev][j];
}
}
now ^= 1;
prev ^= 1;
}
// cout << "Max value: " << dp[prev][T] << endl << endl;
return dp[prev][T];
}
int main() {
// vector<int> w = {10, 20, 30};
// vector<int> v = {60, 100, 120};
// int T = 50;
freopen("rucsac.in", "r", stdin);
freopen("rucsac.out", "w", stdout);
int N, T;
cin >> N;
cin >> T;
vector<int> w(N);
vector<int> v(N);
for (int i = 0; i < N; i++) {
cin >> w[i] >> v[i];
}
cout << knapsack_2D(w, v, T) << endl;
// cout << knapsack_2D_opt(w, v, T) << endl;
return 0;
}