Pagini recente » Cod sursa (job #1311284) | Monitorul de evaluare | Cod sursa (job #2158439) | Cod sursa (job #1568397) | Cod sursa (job #1208552)
/******************************************************************************************
* .--. *
* ::\`--._,'.::.`._.--'/:: @author Ana M. Mihut @course InfoArena Tryout *
* ::::. ` __::__ ' .::::: @alias LT-Kerrigan @date 08.07.2014 *
* ::::::-:.`'..`'.:-:::::: @link http://infoarena.ro/problema/energii *
* ::::::::\ `--' /:::::::: @detail knapsack not greedy *facepalm* *
* *
*******************************************************************************************/
#include <iostream>
#include <fstream>
#include <vector>
#include <stdio.h>
using namespace std;
unsigned int G;
unsigned int W;
bool PassPreliminaryTest(vector<unsigned int> energy, unsigned int W ){
unsigned int sumTest = 0;
for (int i = 0; i < energy.size(); i++){
sumTest += energy[i];
if (sumTest >= W)
return true;
}
return false;
}
void Solve(vector<unsigned int> Eg, vector<unsigned int> Cg, vector<unsigned int> Tcost){
unsigned int flag = -1;
for (int i = 0; i < G; i++) {
for (int j = 2 * W; j >= Eg[i]; j--)
{
if ( (Tcost[j - Eg[i]]) && (!Tcost[j] || (Tcost[j - Eg[i]] + Cg[i] < Tcost[j])))
{
Tcost[j] = Tcost[j - Eg[i]] + Cg[i];
if (j >= W)
if ((flag == -1) || (Tcost[flag] > Tcost[j]))
flag = j;
}
}
}
if (flag != -1)
printf("%d\n", Tcost[flag] - 1);
}
int main(){
freopen("energii.in", "r", stdin);
freopen("energii.out", "w", stdout);
scanf("%d %d", &G, &W);
vector<unsigned int> Eg(G);
vector<unsigned int> Cg(G);
vector<unsigned int> Tcost(2*W+1, 0);
Tcost[0] = 1;
for (int i = 0; i < G; i++)
scanf("%d %d", &Eg[i], &Cg[i]);
if (!PassPreliminaryTest(Eg, W)){
printf("-1\n");
return 0;
}
Solve(Eg, Cg, Tcost);
return 0;
}