Pagini recente » Cod sursa (job #320770) | Cod sursa (job #1847919) | Cod sursa (job #2101042) | Cod sursa (job #1549838) | Cod sursa (job #1897734)
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
std::vector< std::pair<int,int> > knapsack(std::vector<int> weights,std::vector<int> values,int maxSum){
std::vector<int> dp(maxSum + 1,-1);
std::vector<int> aux(maxSum+1,0);
dp[0] = 0;
int sol = 0;
for(size_t i=0;i<weights.size();i++){
for(int j=maxSum-weights[i];j>=0;j--){
if(dp[j]!=-1 && dp[j + weights[i]] < dp[j]+values[i]){
dp[j+weights[i]] = dp[j] + values[i];
aux[j+weights[i]] = i;
sol = (dp[sol] < dp[j+weights[i]] ? j+ weights[i] : sol);
}
}
}
std::vector< std::pair<int,int> > res;
while(sol!=0){
res.push_back(std::make_pair(weights[aux[sol]],values[aux[sol]]));
sol -=weights[aux[sol]];
}
return res;
}
int main()
{
std::ifstream in("rucsac.in");
int n,maxSum;
in>>n>>maxSum;
std::vector<int> w(n);
std::vector<int> v(n);
for(int i=0;i<n;i++){
in>>w[i]>>v[i];
}
in.close();
std::ofstream out("rucsac.out");
int sol = 0;
for(auto x : knapsack(w,v,10)){
sol+=x.second;
}
out<<sol;
out.close();
return 0;
}