Pagini recente » Cod sursa (job #1755501) | Cod sursa (job #151165) | Cod sursa (job #2513098) | Cod sursa (job #1589381) | Cod sursa (job #1228956)
#include<stdio.h>
#include<string.h>
const int NMAX = 18;
int bloc[NMAX], d[1 << NMAX], leftover[1 << NMAX];
bool vis[1 << NMAX];
int main() {
freopen("zebughil.in", "r", stdin);
freopen("zebughil.out", "w", stdout);
int n, gmax, i, t, conf, newConf;
for(t = 1; t <= 3; ++ t) {
scanf("%d%d", &n, &gmax);
memset(d, 0, sizeof(d));
memset(vis, 0, sizeof(vis));
for(i = 1; i < (1 << n); ++ i)
leftover[i] = gmax;
for(i = 0; i < n; ++ i) {
scanf("%d", &bloc[i]);
d[1 << i] = vis[1 << i] = 1;
leftover[1 << i] = gmax - bloc[i];
}
for(conf = 1; conf < (1 << n); ++ conf)
if(vis[conf])
for(i = 0; i < n; ++ i)
if(!(conf & (1 << i))) {
newConf = conf | (1 << i);
if(leftover[conf] >= bloc[i]) {
if(!vis[newConf] || d[newConf] > d[conf] || (d[newConf] == d[conf] && leftover[conf] - bloc[i] > leftover[newConf])) {
d[newConf] = d[conf];
leftover[newConf] = leftover[conf] - bloc[i];
vis[newConf] = 1;
}
}
else {
if(!vis[newConf] || d[newConf] > d[conf] + 1 || (d[newConf] == d[conf] + 1 && gmax - bloc[i] > leftover[newConf])) {
d[newConf] = d[conf] + 1;
leftover[newConf] = gmax - bloc[i];
vis[newConf] = 1;
}
}
}
printf("%d\n", d[(1 << n) - 1]);
}
return 0;
}