Pagini recente » Cod sursa (job #858688) | Cod sursa (job #2594832) | Cod sursa (job #2536596) | Cod sursa (job #2602460) | Cod sursa (job #1750899)
#include <iostream>
#define MAXN 18
using namespace std;
int g;
struct cost
{
int cam, rest;
cost(int cam, int rest) : cam(cam), rest(rest) { }
cost(int rest = 0) : cam(0), rest(rest) { }
bool operator<(const cost &e) const
{
if (this->cam != e.cam) return this->cam < e.cam;
return this->rest < e.rest;
}
cost operator+(cost e)
{
int c = cam + e.cam, re;
long long r = 1LL*rest + e.rest;
if (r > 1LL*g)
re = e.rest, c++;
else
re = rest + e.rest;
return cost(c, re);
}
};
int n;
cost bl[MAXN];
void citire()
{
scanf("%d %d", &n, &g);
for (int i = 0; i < n; i++) {
int t;
scanf("%d", &t);
bl[i] = cost(t);
}
}
cost best[1<<MAXN];
void solve()
{
best[0] = cost(0);
for (int i = 1; i < (1<<n); i++) {
int x = i;
cost mini = cost(100, 100); // 100 cam > inf :D
for (int j = 0; i>>j; j++) {
if ((i>>j) & 1) {
mini = min(mini, best[i ^ (1<<j)]+bl[j]);
}
}
best[i] = mini;
}
printf("%d\n", best[(1<<n)-1].cam+1);
}
int main()
{
freopen("zebughil.in", "r", stdin);
freopen("zebughil.out", "w", stdout);
int t = 3;
while (t--) {
citire();
solve();
}
return 0;
}