Pagini recente » Cod sursa (job #2913533) | Cod sursa (job #959652) | Cod sursa (job #88265) | Cod sursa (job #18441) | Cod sursa (job #18690)
Cod sursa(job #18690)
#include <stdio.h>
#include <algorithm>
using namespace std;
#define maxn 20010
#define maxx 75010
#define maxc 210
int n,m,sol,rez,l;
int a[maxn],s[maxn],b[maxc];
int c[maxx],d[maxx];
int cmp(int x,int y)
{
return (x>y);
}
int main()
{
freopen("ghiozdan.in","r",stdin);
freopen("ghiozdan.out","w",stdout);
int i,j,x,y;
scanf("%d %d",&n,&m);
for (i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[a[i]]++;
}
sort(a+1,a+n+1,cmp);
sol=0;
for (i=1;i<=m;i++) c[i]=maxn;
c[0]=0;
for (i=1;i<=n;i++)
{
for (j=0;j<=m;j++) d[j]=c[j];
for (j=0;j+a[i]<=m;j++)
if ((d[j]!=maxn) && (d[j]+1<c[j+a[i]]))
{
c[j+a[i]]=d[j]+1;
if (j+a[i]>sol)
{
sol=j+a[i];
rez=c[j+a[i]];
}
else if ((j+a[i]==sol) && (d[j]+1<rez)) rez=d[j]+1;
}
}
x=n;
y=sol;
l=0;
while ((y>0) && (l<rez))
{
for (i=1;i<=n;i++)
if ((b[a[i]]>0) && (y-a[i]>=0) && (c[y-a[i]]+1==c[y]))
{
s[++l]=a[i];
y-=a[i];
b[a[i]]--;
break;
}
}
printf("%d %d\n",sol,rez);
for (i=1;i<=rez;i++) printf("%d\n",s[i]);
return 0;
}