Pagini recente » Cod sursa (job #1416408) | Cod sursa (job #787647) | Cod sursa (job #2630666) | Cod sursa (job #98557) | Cod sursa (job #43499)
Cod sursa(job #43499)
#include <stdio.h>
#define NMAX 18
#define INFI (1 << 20)
#define MC 50000
unsigned best[MC];
unsigned extra[MC];
long n, g;
long z[NMAX];
void read()
{
int i;
scanf("%ld %ld\n", &n, &g);
for(i = 0; i < n; ++i)
{
scanf("%ld ", &z[i]);
}
}
int dinamic()
{
unsigned next, nb, ne;
unsigned i, j;
for(i = 0; i < (1 << n); best[i] = INFI, ++i);
for(i = 0; i < n; ++i)
{
best[i] = 0;
extra[i] = z[i];
}
for(i = 1; i < (1 << n); ++i)
{
for(j = 0; j < n; ++j)
{
if(!(i & (1 << j)))
{
next = i | (1 << j);
if(extra[i] + z[j] > g)
{
nb = best[i]+1;
ne = z[i];
}
else
{
nb = best[i];
ne = extra[i] + z[i];
}
if((nb < best[next]) || ((nb == best[next]) && (ne < extra[next])))
{
best[next] = nb;
extra[next] = ne;
}
}
}
}
return best[(1 << n) - 1] + (extra[(1 <<n) - 1] > 0);
}
int main()
{
freopen("zebughil.in", "r", stdin);
freopen("zebughil.out", "w", stdout);
for(int i = 0; i < 3; ++i)
{
read();
printf("%d\n", dinamic());
}
fclose(stdin);
fclose(stdout);
return 0;
}