Pagini recente » Cod sursa (job #2591193) | Cod sursa (job #1271803) | Cod sursa (job #3258865) | Cod sursa (job #1308816) | Cod sursa (job #379547)
Cod sursa(job #379547)
#include <stdio.h>
#define NMAX 17
int D[(1<<NMAX)], S[(1<<NMAX)], R[(1<<NMAX)], v[NMAX];
int n, G;
inline int minim(int x,int y){
if(x > y) return y;
return x;
}
inline int maxim(int x,int y){
if(x < y) return y;
return x;
}
int main(){
freopen("zebughil.in", "r", stdin);
freopen("zebughil.out", "w", stdout);
int i, j, s;
for(int t = 3; t; --t){
scanf("%d %d", &n, &G);
for(i = 0; i < n; ++i)
scanf("%d", &v[i]);
for(i = 1; i < (1<<n); ++i)
D[i] = n;
for(i = 1; i < (1<<n); ++i){
for(j = 0, s = 0; (1<<j) <=i; ++j)
if(i & (1<<j)) s += v[j];
//if(s == 0) s = v[j-1];
S[i] = s;
if(s <= G) {
D[i] = 1;
R[i] = G - S[i];
continue;
}
s = 0;
for(j = 0; (1<<j) < i; ++j)
if(R[i - (1<<j)] >= v[j])
if(D[i - (1<<j)] < D[i]){
D[i] = D[i - (1<<j)];
s = R[i - (1<<j)] - v[j];
}
else if(D[i - (1<<j)] == D[i]) s = maxim(s, R[i - (1<<j)] - v[j]);
else ;
else if(D[i] > D[i - (1<<j)] + 1){
D[i] = D[i - (1<<j)] + 1;
s = G - v[j];
}
else if(D[i] == D[i - (1<<j)] + 1) s = maxim(s, G - v[j]);
R[i] = s;
}
printf("%d\n", D[(1<<n)-1]);
}
return 0;
}