Pagini recente » Cod sursa (job #1206845) | Cod sursa (job #1326467) | Cod sursa (job #797872) | Cod sursa (job #2423751) | Cod sursa (job #2458895)
#include <bits/stdc++.h>
#define MAX 131072
using namespace std;
const int NMAX = 5005;
FILE *IN;
int G, W, ans, S;
int dp[2][2 * NMAX];
pair <int, int> E[NMAX];
int pos, sign;
char f[MAX];
inline void Read(int &nr){
sign = 0;
nr = 0;
while(f[pos] < '0' || f[pos] > '9'){
if(f[pos] == '-') sign = 1;
pos++;
if(pos == MAX)
fread(f, MAX, 1, IN), pos = 0;
}
while(f[pos] >= '0' && f[pos] <= '9'){
nr = 10 * nr + f[pos++] - '0';
if(pos == MAX)
fread(f, MAX, 1, IN), pos = 0;
}
if(sign) nr =- nr;
}
inline void read(){
Read(G); Read(W);
for(int i = 1; i <= G; i++){
Read(E[i].first);
Read(E[i].second);
S += E[i].first;
}
}
int main(){
IN = fopen("energii.in", "r");
freopen("energii.out", "w", stdout);
read();
if(S < W){
printf("-1");
return 0;
}
for(int i = 1; i <= 2 * 5001; i++)
dp[0][i] = 2e9, dp[1][i] = 2e9;
ans = 2e9;
int line = 0;
for(int i = 1; i <= G; i++){
for(int j = 1; j <= 5000; j++){
if(dp[1 - line][j] != 2e9){
if(E[i].first + j <= 5000){
dp[line][E[i].first + j] = min(dp[1 - line][E[i].first + j], E[i].second + dp[1 - line][j]);
dp[line][j] = min(dp[1 - line][j], dp[line][j]);
} else if(E[i].first >= W) ans = min(ans, E[i].second);
else if(E[i].first + j >= W) ans = min(ans, E[i].second + dp[1 - line][j]);
}
}
dp[line][E[i].first] = min(dp[line][E[i].first], E[i].second);
line = 1 - line;
}
for(int i = W; i <= 2 * 5000; i++)
ans = min(ans, dp[1 - line][i]);
printf("%d", ans);
return 0;
}