Pagini recente » Cod sursa (job #925375) | Cod sursa (job #2213951) | Cod sursa (job #1842350) | Cod sursa (job #2025280) | Cod sursa (job #944289)
Cod sursa(job #944289)
#include<cstring>
#include<cstdio>
#define NMAX 105
#define INF 0x3f3f3f3f
FILE *f=fopen("lapte.in","r");
FILE *g=fopen("lapte.out","w");
using namespace std;
struct milk
{
int f_type;
int s_type;
};
milk v[NMAX];
int quantity,Answer,n,DP[NMAX][NMAX];
int SOL[NMAX][NMAX];
void Read ( void )
{
fscanf(f,"%d%d",&n,&quantity);
for(int i(1) ; i <= n ; ++i )
{
fscanf(f,"%d%d",&v[i].f_type,&v[i].s_type);
}
fclose(f);
}
void Initialize( void )
{
memset(DP,-INF,sizeof(DP));
DP[0][0]=0;
}
//DP[i][i]=cantitatea maxima de lapte B ce poate fi bautata pentru i lapte de A
bool check ( int TIME )
{
Initialize();
for(int i(1) ; i <= n ; ++i )
for(int ii(0) ; ii <= quantity ; ++ii )
for(int k(0) ; k*v[i].f_type <= TIME && k <= ii ; ++k )
if( DP[i-1][ii-k] != -INF && DP[i][ii] < DP[i-1][ii-k]+ ( TIME - k*v[i].f_type )/v[i].s_type)
{
DP[i][ii]=DP[i-1][ii-k]+ ( TIME - k*v[i].f_type )/v[i].s_type;
SOL[i][ii]=k;
}
return (DP[n][quantity]>=quantity);
}
void Solve ( void )
{
int left=1,right=100;
int mid;
for(int i(1) ; i <= 100 ; ++i )
{
if(check(i))
{
Answer=i;
break;
}
}
}
void Write ( int i , int l )
{
if ( i == 0)
return;
Write(i-1,l-SOL[i][l]);
fprintf(g,"%d %d\n",SOL[i][l],(Answer-SOL[i][l]*v[i].f_type)/v[i].s_type);
}
int main ( void )
{
Read();
Solve();
fprintf(g,"%d\n",Answer);
Write(n,quantity);
fclose(g);
return 0;
}