Pagini recente » Cod sursa (job #1028486) | Cod sursa (job #2148841) | Cod sursa (job #2496382) | Cod sursa (job #1056636) | Cod sursa (job #1506741)
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxN 17
using namespace std;
int t, n, i, j, g, z[maxN + 2];
struct din
{
int q;
int nl;
}dp[(1 << maxN) + 2];
void rsw()
{
freopen("zebughil.in", "r", stdin);
freopen("zebughil.out", "w", stdout);
t = 3;
while (t --)
{
scanf("%d %d", &n, &g);
for (i = 0; i < n; ++ i)
scanf("%d", &z[i]);
memset(dp, 0, sizeof(dp));
dp[0].nl = 1;
dp[0].q = g;
for (i = 1; i < 1 << n; ++ i)
for (j = 0; j < n; ++ j)
if (i & (1 << j))
{
if (dp[i].nl == 0 || dp[i ^ (1 << j)].nl + (dp[i ^ (1 << j)].q < z[j]) <= dp[i].nl)
{
if (dp[i ^ (1 << j)].nl + (dp[i ^ (1 << j)].q == z[j]) <= dp[i].nl)
{
if (dp[i ^ (1 << j)].q >= z[j] && dp[i ^ (1 << j)].q - z[j] >= dp[i].q)
dp[i].q = dp[i ^ (1 << j)].q - z[j];
else
if (dp[i ^ (1 << j)].q < z[j] && g - z[j] >= dp[i].q)
dp[i].q = g - z[j];
continue;
}
dp[i].nl = dp[i ^ (1 << j)].nl + (dp[i ^ (1 << j)].q < z[j]);
if (dp[i ^ (1 << j)].q >= z[j])
dp[i].q = dp[i ^ (1 << j)].q - z[j];
else
dp[i].q = g - z[j];
}
}
printf("%d\n", dp[(1 << n) - 1].nl);
}
}
int main()
{
rsw();
return 0;
}