Cod sursa(job #1897734)

Utilizator TamasFlorin96Tamas Florin TamasFlorin96 Data 1 martie 2017 17:43:40
Problema Problema rucsacului Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#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;
}