Pagini recente » Cod sursa (job #2616568) | Cod sursa (job #1119683) | Cod sursa (job #1275668) | Cod sursa (job #1195008) | Cod sursa (job #87850)
Cod sursa(job #87850)
#include <cstdio>
#include <string>
#define maxn 101
int n, S;
int dp[maxn][maxn], pi[maxn][maxn];
bool oki[maxn][maxn];
int a[maxn], b[maxn];
void read()
{
freopen("lapte.in","r",stdin);
scanf("%d %d\n", &n, &S);
for(int i=1;i<=n;++i)scanf("%d %d\n", a+i, b+i);
}
inline int dynamic(int T)
{
// memset(dp, 0, sizeof(dp));
//memset(pi, 0, sizeof(pi));
//memset(oki, 0, sizeof(oki));
int i, j, t;
dp[0][0]=0;
for(i=0;i<=n;++i)
for(j=0;j<=S;++j)dp[i][j]=0, pi[i][j]=0, oki[i][j]=0;
oki[0][0]=1;
// for(i=0;i<=T;++i) dp[1][i]=(T-t*a[1])/b[1];
// for(i=0;i<=T;++i) if(dp[1][i]<0) dp[1][i]=0;
for(i=1;i<=n;++i)
for(j=0;j<=S;++j)
{
for(t=0; t*a[i]<=T;++t)
{
if(j<t)break;
if(t>S)break;
// printf("(i: %d j: %d t:%d) %d\n",i, t,j, dp[i-1][j-t]+(T-t*a[i])/b[i]);
if(oki[i-1][j-t])
{
int r;
if(b[i]==0) r=dp[i-1][j-t];
else r=dp[i-1][j-t]+(T-t*a[i])/b[i];
if(r>dp[i][j])dp[i][j]=r, pi[i][j]=t;
oki[i][j]=1;
}
}
}
/* if(T==18)
{
for(i=1;i<=n;++i)
{
for(j=0;j<=S;++j)printf("%d ", dp[i][j]);
printf("\n");
}
}
*/
if(dp[n][S]>=S)return 1;
return 0;
}
void afis(int i, int j, int T)
{
if(i!=0)
{
afis(i-1, j-pi[i][j],T);
int e=0;
if(T-pi[i][j]*a[i]==0)e=0;
else if(b[i]==0) e=0;
else e=(T-pi[i][j]*a[i])/b[i];
printf("%d %d\n", pi[i][j], e);
}
}
void solve()
{
int cnt, T;
for(cnt=(1<<20), T=(1<<20); cnt ; cnt>>=1)
if(T-cnt>=0)
if(dynamic(T-cnt)) T-=cnt;
// printf("%d\n", dp[n][S]);
//printf("%d\n", S);
dynamic(T);
printf("%d\n", T);
afis(n, S, T);
}
int main()
{
read();
// solve();
freopen("lapte.out","w",stdout);
solve();
// dynamic(18);
return 0;
}