Cod sursa(job #1613371)

Utilizator gapdanPopescu George gapdan Data 25 februarie 2016 12:53:45
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <cstdio>
#define NMAX 105

using namespace std;

int n,i,l,sol,st,dr,mij,ok;
int c[105][105];
struct punct
{
    int x,y;
}v[NMAX];
int dp[105][105];

bool Solutie(int T)
{
    int i,j,k;
    for(i=0;i<=n;++i)
        for(j=0;j<=l;++j) dp[i][j]=-101;
    dp[0][0]=0;
    for(i=1;i<=n;++i)
        for(k=0;k<=l;++k)
            for(j=0;j*v[i].x<=T;++j)
            {
                if(dp[i][k]  < dp[i-1][k-j] + (T-j*v[i].x)/v[i].y)
                {
                    dp[i][k]=dp[i-1][k-j] + (T-j*v[i].x)/v[i].y;
                    c[i][k]=j;
                }
            }
    if(dp[n][l] >= l) return 0;
        else return 1;
}

void afis(int x, int y, int z)
{
    if(x!=0)
    {
        afis(x-1,y-c[x][y],y);
        printf("%d %d\n",c[x][y],(sol-c[x][y]*v[x].x)/v[x].y);
    }
}

int main()
{
    freopen("lapte.in","r",stdin);
    freopen("lapte.out","w",stdout);
    scanf("%d%d",&n,&l);
    for(i=1;i<=n;++i)
        scanf("%d%d",&v[i].x,&v[i].y);
    st=1;dr=100;
    while(st <= dr)
    {
        int mij=(st+dr)/2;
        ok = Solutie(mij);
        if( ok == 0) {dr=mij-1;sol=mij;}
            else st=mij+1;
    }
    printf("%d\n",sol);
    afis(n,l,sol);
    return 0;
}