Pagini recente » Cod sursa (job #1635442) | Cod sursa (job #2454761) | Cod sursa (job #2029647) | Cod sursa (job #2704975) | Cod sursa (job #1560970)
#include <stdio.h>
#include <algorithm>
#define nmax 75010
#define inf 0x3f3f3f3f
using namespace std;
struct date { int last,nr; };
int n,g,x;
int p[210],dp[nmax];
date path[nmax];
void findpath(int x)
{
if (x==0) return; else
{
for (int i=1;i<=path[x].nr;i++) printf("%d\n",(x-path[x].last)/path[x].nr);
findpath(path[x].last);
}
}
int main()
{
freopen("ghiozdan.in","r",stdin);
freopen("ghiozdan.out","w",stdout);
scanf("%d %d",&n,&g);
for (int i=1;i<=n;i++) scanf("%d",&x),p[x]++;
dp[0]=0;
for (int i=1;i<=g;i++) dp[i]=inf;
for (int i=200;i>=1;i--)
if (p[i]>0) {
for (int j=g-i;j>=0;j--)
if (dp[j]!=inf) {
for (int k=1;k<=p[i];k++) {
if (j+k*i>g || dp[j+k*i]!=inf) break;
if (dp[j+k*i]>dp[j]+k) {
dp[j+k*i]=dp[j]+k; path[j+k*i].last=j; path[j+k*i].nr=k;
}
}
}
}
for (int i=g;i>=1;i--)
if (dp[i]!=inf) {
printf("%d %d\n",i,dp[i]); findpath(i); break;
}
return 0;
}