52 lines
926 B
C++
52 lines
926 B
C++
#include<cstdio>
|
|
#include<cstring>
|
|
int n,m,i,j,k,w[1001][1001],c[1001],p[1001];
|
|
long long ans,f[1001][1001];
|
|
int max(int x,int y)
|
|
{
|
|
if (x>y) return x;
|
|
else return y;
|
|
}
|
|
void find(int i,int j)
|
|
{
|
|
int k;
|
|
if (i==0) return;
|
|
for(k=0;k<=p[i];k++)
|
|
if (j-c[i]*k>=0)
|
|
if (f[i-1][j-c[i]*k]+w[i][k]==f[i][j])
|
|
{
|
|
find(i-1,j-c[i]*k);
|
|
printf("%d\n",k);
|
|
return;
|
|
}
|
|
|
|
}
|
|
int main()
|
|
{
|
|
scanf("%d%d",&n,&m);
|
|
for(i=1;i<=n;i++)
|
|
{
|
|
scanf("%d%d",&c[i],&p[i]);
|
|
w[i][0]=0;
|
|
for(j=1;j<=p[i];j++)
|
|
scanf("%d",&w[i][j]);
|
|
}
|
|
memset(f,-127/2,sizeof(f));
|
|
f[0][0]=0;
|
|
for(i=1;i<=n;i++)
|
|
for (j=0;j<=m;j++)
|
|
{
|
|
f[i][j]=max(f[i][j],f[i-1][j]);
|
|
for(k=1;k<=p[i];k++)
|
|
if (j-k*c[i]>=0)
|
|
f[i][j]=max(f[i-1][j-k*c[i]]+w[i][k],f[i][j]);
|
|
}
|
|
ans=0;
|
|
k=0;
|
|
for(i=0;i<=m;i++)
|
|
if (f[n][i]>ans)
|
|
{ans=f[n][i];k=i;}
|
|
printf("%I64d\n",ans);
|
|
find(n,k);
|
|
}
|
|
|