Pagini recente » Cod sursa (job #1111623) | Cod sursa (job #561316) | Cod sursa (job #1721762) | Cod sursa (job #3189681) | Cod sursa (job #3227513)
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin("rucsac.in");
ofstream fout("rucsac.out");
int cost, weight;
int n, w_max, DP_prev[10001], DP_curr[10001];
// DP[i][j] = Suma maximă care se poate obține, având
// acces la primele i obiecte și la un rucsac cu
// greutate maximă j.
// Ținem doar două rânduri: DP_prev și DP_curr.
// E mai bine din punct de vedere al memoriei.
int knapsack()
{
/*
Deja adevărat din faptul că l-am declarat
global pe DP_prev.
for(int i = 1; i <= n; i++)
DP_prev[i] = 0;
*/
for(int i = 1; i <= n; i++)
{
fin >> weight >> cost;
for(int j = 1; j <= w_max; j++)
if(j - weight >= 0) // Dacă obiectul curent încape în rucsac:
DP_curr[j] = max(DP_prev[j], DP_prev[j - weight] + cost);
// Văd ce e mai bine: fie folosesc configurația anterioară, DP[i - 1][j], fără a adăuga obiectul curent,
// fie adaug obiectul curent la configurație, ținând cont de greutatea sa, deci mă uit la configurația
// cu objs[i].weight greutate mai puțin.
else
DP_curr[j] = DP_prev[j]; // Obiectul curent nu încape în rucsac, nu pot îmbunătăți nimic.
for(int j = 1; j <= w_max; j++)
DP_prev[j] = DP_curr[j];
}
return DP_curr[w_max];
}
int main()
{
fin >> n >> w_max;
fout << knapsack();
return 0;
}