Pagini recente » Cod sursa (job #1238734) | Cod sursa (job #711869) | Cod sursa (job #3129302) | Cod sursa (job #1512902) | Cod sursa (job #18891)
Cod sursa(job #18891)
#include <cstdio>
#include <string>
#define maxn 20001
#define maxS 75001
#include <cstdlib>
#define oo 0x3f3f3f3f
#include <algorithm>
using namespace std;
char aux[4*20005];
int main()
{
int G, n, x[maxn], dp[maxS], nr[maxS], pi[maxS], i, j;
freopen("ghiozdan.in", "r", stdin);
freopen("ghiozdan.out", "w", stdout);
scanf("%d %d\n", &n, &G);
fread(aux, sizeof(char), 4*20000, stdin);
char *p;
p=strtok(aux, " \n");
x[1]=atoi(p);
for(i=2;i<=n;i++)
{
p=strtok(0, " \n");
x[i]=atoi(p);
}
// for(i=1;i<=n;i++) scanf("%d\n", &x[i]);
memset(dp, 0, sizeof(dp));
memset(nr, oo, sizeof(nr));
memset(pi, 0, sizeof(pi));
sort(x+1, x+n+1);
reverse(x+1, x+n+1);
dp[0]=1;
nr[0]=0;
for(i=1;i<=n;++i)
for(j=G;j>=x[i];--j)
if(dp[j-x[i]])
if(nr[j-x[i]]+1<nr[j])
{
//printf("%d \n", j);
dp[j]=1;
nr[j]=nr[j-x[i]]+1;
pi[j]=x[i];
break;
}
int poz=0, Nr=0;
for(i=G;i>=0;i--)
if(dp[i]) { poz=i; break;}
for(i=poz;i>0;i-=pi[i]) Nr++, dp[i]=2;
printf("%d %d\n", poz, Nr);
for(i=G;i>=0;i--)
if(dp[i]==2)
printf("%d\n", pi[i]);
return 0;
}