Pagini recente » Cod sursa (job #845889) | Cod sursa (job #1357635) | Cod sursa (job #78283) | Cod sursa (job #1504995) | Cod sursa (job #1631151)
#include <bits/stdc++.h>
#define maxN 103
using namespace std;
int t[maxN][2];
int dp[maxN][maxN];
int a[maxN][maxN];
int b[maxN][maxN];
int n, i, j, mij, st, dr, l;
bool verif(int &n, int &l, int &maxT)
{
//resetez
memset(dp, -1, sizeof(dp));
dp[0][0]=0;
for(i = 1; i <= n; i++)
{
int maxx = maxT/t[i][0];
for(int ind=0;ind <= maxx;ind++)
{
int iau=(maxT-ind*t[i][0])/t[i][1];
//rucsac
for(int j=l;j>=ind;j--)
if(dp[i-1][j-ind]!=-1 && dp[i][j]<dp[i-1][j-ind]+iau)
{
dp[i][j]=dp[i-1][j-ind]+iau;
a[i][j]=j-ind;
b[i][j]=iau;
}
}
}
return (dp[n][l] >= l);
}
void afisare(int n, int l, int &maxT)
{
int i;
for(i = n; i >= 1; i--)
printf("%d %d\n", (maxT-b[i][l]*t[i][1])/t[i][0], b[i][l]), l=a[i][l];
}
void afisarerec(int n,int l,int &maxT)
{
if(n!=0)
{
afisarerec(n-1,a[n][l],maxT);
printf("%d %d\n",(maxT-b[n][l]*t[n][1])/t[n][0],b[n][l]);
}
}
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\n", &t[i][0], &t[i][1]);
//caut binar solutia
st=0, dr=maxN;
while(dr-st-1)
{
mij = (st+dr)/2;
if(verif(n, l, mij))
dr = mij;
else st = mij;
}
printf("%d\n", dr);
//refac solutia
verif(n, l, dr);
afisarerec(n, l, dr);
return 0;
}