Pagini recente » Cod sursa (job #1849687) | Cod sursa (job #2910) | Cod sursa (job #102447) | Cod sursa (job #1398455) | Cod sursa (job #18626)
Cod sursa(job #18626)
#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)
{
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)
{
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;
}