Cod sursa(job #715176)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 16 martie 2012 19:39:58
Problema Lapte Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <fstream>
#include <cstring>
#include <cstdio>
#define NMAx 110
using namespace std;

int N,L,Timp,A[NMAx],B[NMAx];
int Best[NMAx][NMAx],T[NMAx][NMAx];
int Sol[NMAx][NMAx];
ofstream out("lapte.out");

void afis(int i,int j) {
	
	if(i-1)
		afis(i-1,j-Sol[i][j]);
	
	out<<Sol[i][j]<<' '<<((Timp-Sol[i][j]*A[i])/B[i])<<'\n';
	
}
bool Solution(int t) {
	
	int i,l,k,Val;
	
	memset(Best,-100,sizeof(Best));
	Best[0][0]=0;
	
	for(i=1;i<=N;i++)
		for(l=0;l<=L;l++)
			for(k=0;k<=l&&k<=t/A[i];k++) {
				
				Val=Best[i-1][l-k]+(t-k*A[i])/B[i];
				
				if(Best[i][l]<Val) {
					Best[i][l]=Val;
					T[i][l]=k;
					}
				
				}
	
	if(Best[N][L]>=L)
		return 1;
	return 0;
	
}
void solve() {
	
	int i=0,Step=100;
	
	for(;Step;Step>>=1)
		if(Solution(100-i-Step)) {
			i+=Step;
			memcpy(Sol,T,sizeof(T));
			}
		
	Timp=100-i;
	
}
void citire() {
	
	ifstream in("lapte.in");
	
	in>>N>>L;
	
	for(int i=1;i<=N;i++)
		in>>A[i]>>B[i];
	
	in.close();
	
}
int main() {
	
	citire();
	
	solve();
	
	out<<Timp<<'\n';
	afis(N,L);
	out.close();
	
	return 0;
	
}