Pagini recente » Cod sursa (job #1937054) | Cod sursa (job #2171942) | Cod sursa (job #2374639) | Cod sursa (job #566766) | Cod sursa (job #18176)
Cod sursa(job #18176)
#include <stdio.h>
#include <string.h>
#define MG (75009)
int INF;
int N, G;
int c[MG], n[201];
unsigned char p[MG];
int main()
{
int i, j, k;
freopen("ghiozdan.in", "r", stdin);
freopen("ghiozdan.out", "w", stdout);
scanf("%d %d", &N, &G);
for(i = 0; i < N; ++ i) {
scanf("%d", &j);
++ n[j];
}
/*
for(i = 1; i <= 200; ++ i) if(n[i])
printf("%d %d\n", i, n[i]);
return 0;
*/
memset(&INF, 0x3f, sizeof(INF));
memset(c, 0x3f, sizeof(c)); c[0] = 0;
/*
printf("%d %d %d\n", INF, c[0], c[1]);
return 0;
*/
for(k = 200; k > 0; -- k) if(n[k]) {
for(i = G-k; i >= 0; -- i) if(c[i] < INF)
for(j = i+k; n[k] && j <= G; j += k, -- n[k]) {
if(c[j-k]+1 < c[j]) {
c[j] = c[j-k]+1;
p[j] = k;
} else break;
}
}
/*
for(i = 0; i <= G; ++ i)
printf("%d ", c[i]); printf("\n");
for(i = 0; i <= G; ++ i)
printf("%d ", p[i]); printf("\n");
return 0;
*/
for(i = G; i >= 0; -- i) if(c[i] < INF) {
printf("%d %d\n", i, c[i]);
for(j = i; j > 0; j -= p[j])
printf("%d\n", p[j]);
break;
}
return 0;
}