Pagini recente » Cod sursa (job #751346) | Cod sursa (job #1244846) | Cod sursa (job #1679894) | Cod sursa (job #41006) | Cod sursa (job #209007)
Cod sursa(job #209007)
#include <fstream>
#include <iostream>
using namespace std ;
int n , m ;
int a[100+30], b[100+30] ;
int g[100+30][100+30];
int v[100+30][100+30][2];
int sol[100+30][2];
void
readInput ( ) {
ifstream is ( "lapte.in" ) ;
int i ;
is >> n >> m ;
for ( i = 0 ; n > i ; ++ i ) {
is >> a[i] ;
is >> b[i] ;
}
}
void
eval ( int t ) {
int u , x , k , s , q ;
for ( u = 0 ; m >= u ; ++ u ) {
for ( x = 0 ; m >= x ; ++ x ) {
g[u][x] = 0 ;
}
}
g[0][0] = 1 ;
for ( k = 0 ; n > k ; ++ k ) {
for ( u = m ; 0 <= u ; -- u ) {
for ( x = m ; 0 <= x ; -- x ) {
if (g[u][x]) continue ;
for ( s = min(u,t/a[k]); 0 <= s ; -- s ) {
q = (t-s*a[k])/b[k];
if (g[u-s][max(0,x-q)]) {
g[u][x] = 1 ; v[u][x][0]=k ; v[u][x][1]=s ;
// cout << "(u,x,k,s): " << u << ' ' << x << ' ' << k << ' ' << s << endl ;
break ;
}
}
}
}
}
}
void
writeSolution ( int t ) {
ofstream os ( "lapte.out" ) ;
int i , u , x , s , q , k ;
for (i=0;i<n;i++) {
sol[i][0]=0, sol[i][1]=0;
}
u=m, x=m;
while(0!=u || 0!=x) {
k=v[u][x][0], s=v[u][x][1], q=(t-s*a[k])/b[k];
sol[k][0]=s, sol[k][1]=q;
(u<=s) ? u = 0 : u -= s;
(x<=q) ? x = 0 : x -= q;
}
os << t << endl ;
for(i=0;i<n;i++) {
os << sol[i][0] << ' ' << sol[i][1] << endl ;
}
}
int
main ( ) {
readInput ( ) ;
int lo = 1 , hi = 100 , t ;
while (lo < hi) {
t = ( lo + hi ) / 2 ;
// cout << "t: " << t << endl ;
eval ( t ) ;
if ( g[m][m] ) {
hi = t ;
} else {
lo = t+1;
}
}
if (lo > t) {
eval ( lo ) ;
t = lo ;
}
writeSolution ( t ) ;
return 0 ;
}