Cod sursa(job #2522658)

Utilizator roxana.istratePoenaru Roxana roxana.istrate Data 12 ianuarie 2020 19:49:47
Problema Problema rucsacului Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#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-1]] + v[i-1], 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;

}