Pagini recente » Cod sursa (job #235546) | Cod sursa (job #1625665) | Cod sursa (job #2573973) | Cod sursa (job #2318856) | Cod sursa (job #2849976)
#include <iostream>
#include <vector>
using namespace std;
vector<int> dynamic(int S, int n, vector<int> s, vector<int> v) {
int o[S+1][n+1];
int p[S+1][n+1];
vector<int> R;
for (int np = 1; np <= n; np++) {
o[0][np] = 0;
}
for (int Sp = 0; Sp <= S; Sp++) {
o[Sp][0] = 0;
}
for (int np = 1; np <= n; np++) {
for (int Sp = 0; Sp <= S; Sp++) {
if (Sp < s[np-1]) {
o[Sp][np] = o[Sp][np-1];
p[Sp][np] =1;
}
else {
int o1 = o[Sp][np-1];
int o2 = o[Sp-s[np-1]][np-1] + v[np-1];
if (o1 > o2) {
o[Sp][np] = o1;
p[Sp][np] = 1;
} else {
o[Sp][np] = o2;
p[Sp][np] = 2;
}
}
}
}
int Sp = S;
for (int np = n; np >= 1; np--) {
if (p[Sp][np] == 2) {
R.push_back(np);
Sp = Sp - s[np-1];
}
}
return R;
}
int main() {
freopen("rucsac.in", "r", stdin);
freopen("rucsac.out", "w", stdout);
int N, G;
cin >> N >> G;
vector<int> s, v;
for (int i = 1; i <= N; i++) {
int sp, vp;
cin >> sp >> vp;
s.push_back(sp);
v.push_back(vp);
}
vector<int> ans = dynamic(G, N, s, v);
int sum = 0;
for (int i = 0; i < ans.size(); i++) {
sum += v[ans[i]-1];
}
cout << sum;
return 0;
}