Pagini recente » Cod sursa (job #1233068) | Cod sursa (job #886740) | Cod sursa (job #1337207) | Cod sursa (job #126620) | Cod sursa (job #720208)
Cod sursa(job #720208)
#include <fstream>
#include <cstdlib>
#include <cstring>
using namespace std;
ifstream in("zebughil.in");
ofstream out("zebughil.out");
const int N = 18;
const int U = 1<<18;
int n, g;
int v[N];
int d[U+N][N];
bool filled[U+N][N];
void read()
{
in >> n >> g;
for (int i = 1; i <= n; ++i)
in >> v[i];
}
inline int bit(int value) {
return (1 << (value-1));
}
inline int minim(int a, int b) {
return (a<b ? a:b);
}
void solve()
{
memset(d, 0, sizeof(d));
for (int i = 1; i <= n; ++i)
d[bit(i)][1] = v[i];
for (int conf = 0; conf < bit(n+1); ++conf)
for (int camUsed = 1; camUsed < n; ++camUsed)
if(d[conf][camUsed])
for (int curStone = 1; curStone <= n; ++curStone) {
if ((conf&bit(curStone)) == 0) {
if (d[conf][camUsed] + v[curStone] <= g)
if (d[conf][camUsed] + v[curStone] < d[conf + bit(curStone)][camUsed]
|| d[conf + bit(curStone)][camUsed] == 0)
d[conf + bit(curStone)][camUsed] = d[conf][camUsed] + v[curStone];
if (minim(d[conf][camUsed], v[curStone]) < d[conf + bit(curStone)][camUsed+1]
|| d[conf + bit(curStone)][camUsed+1] == 0)
d[conf + bit(curStone)][camUsed+1] = minim(d[conf][camUsed], v[curStone]);
}
}
for (int i = 1; i <= n; ++i)
if (d[bit(n+1) - 1][i]) {
out << i << "\n";
return;
}
}
int main()
{
int t = 3;
while (t--) {
read();
solve();
}
return 0;
}