Pagini recente » Cod sursa (job #713010) | Cod sursa (job #403556) | Cod sursa (job #7546) | Cod sursa (job #2104887) | Cod sursa (job #2085843)
#include <fstream>
#include <algorithm>
#define DIM 102
#define INF 2e9
#define ff first
#define ss second
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
int n, l, st;
pair<int, int> pers[DIM], sol[DIM];
int dp[DIM][DIM];
bool calc(int t){
for(int i = 0; i < DIM; ++ i)
for(int j = 0; j < DIM; ++ j)
dp[i][j] = -INF;
dp[0][0] = 0;
for(int i = 1; i <= n; ++ i){
for(int j = 0; j <= l; ++ j){
for(int k = 0; k <= t / pers[i].ff; ++ k){
dp[i][j] = max(dp[i][j], dp[i - 1][j - k] + (t - k * pers[i].ff) / pers[i].ss);
}
}
}
if(dp[n][l] >= l)
return 1;
else
return 0;
}
void rebuild(int t){
int j = l;
for(int i = n; i >= 1; -- i){
for(int k = 0; k <= t / pers[i].ff; ++ k){
if(dp[i][j] == dp[i - 1][j - k] + (t - k * pers[i].ff) / pers[i].ss){
sol[i].ff = k;
sol[i].ss = (t - k * pers[i].ff) / pers[i].ss;
j -= k;
break;
}
}
}
}
int main()
{
f>>n>>l;
for(int i = 1; i <= n; ++ i)
f>>pers[i].ff>>pers[i].ss;
int st = 1;
int dr = 100;
//sort(pers + 1, pers + n + 1);
while(st <= dr){
int mid = (st + dr) / 2;
if(calc(mid))
dr = mid - 1;
else
st = mid + 1;
}
calc(st);
rebuild(st);
g<<st<<'\n';
for(int i = 1; i <= n; ++ i){
g<<sol[i].ff<<" "<<sol[i].ss<<'\n';
}
return 0;
}