Pagini recente » Cod sursa (job #2249889) | Cod sursa (job #426694) | Cod sursa (job #1312806) | Cod sursa (job #1754666) | Cod sursa (job #400935)
Cod sursa(job #400935)
#include <cstdio>
#define FIN "zebughil.in"
#define FOUT "zebughil.out"
#define MAXN 18
#define MAXST (1 << 17)
#define INF 2000000001
int N, V[MAXN], G, R;
unsigned int D[MAXST][MAXN];
unsigned int min(unsigned int A, unsigned int B)
{
return A < B ? A : B;
}
void solve()
{
int i, j, k, ST;
ST = (1 << N) - 1;
for (i = 0; i <= ST; ++ i)
for (j = 0; j <= N; ++ j)
D[i][j] = INF;
D[0][0] = G;
for (i = 0; i <= ST; ++ i)
for (j = 0; j <= N; ++ j)
if (D[i][j] != INF)
{
for (k = 0; k < N; ++ k)
if (!((1 << k) & i))
{
if (1LL * (D[i][j] + V[k + 1]) > G)
D[i | (1 << k)][j + 1] = min(D[i | (1 << k)][j + 1], 1LL * (D[i][j] + V[k + 1]) - G);
else
D[i | (1 << k)][j] = min(D[i | (1 << k)][j], D[i][j] + V[k + 1]);
}
}
for (i = 0; i <= N; ++ i)
{
//printf("***%d\n", D[ST][i]);
if (D[ST][i] != INF)
break;
}
R = i;
}
int main()
{
int i, j;
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
for (i = 1; i <= 3; ++ i)
{
scanf("%d%d", &N, &G);
for (j = 1; j <= N; ++ j)
scanf("%d", &V[j]);
solve();
printf("%d\n", R);
}
}