Pagini recente » Diferente pentru implica-te/arhiva-educationala intre reviziile 75 si 76 | Cod sursa (job #209451) | Cod sursa (job #582954) | Cod sursa (job #2373967) | Cod sursa (job #45933)
Cod sursa(job #45933)
#include <stdio.h>
#include <string.h>
const int infi=1<<30;
const int nmax=17;
FILE *fin=fopen ("zebughil.in","r");
unsigned n,gmax,g[18];
void read() {
fscanf (fin,"%d %d",&n,&gmax);
int i;
for (i=0;i<n;++i)
fscanf (fin,"%d",&g[i]);
}
unsigned best[ 1 << 18 ];
unsigned extra[ 1 << 18 ];
int dinamic() {
int i,j;
for (i=0;i< (1<<n);best[i]=infi,++i);
for (i=0;i<n;++i) {
best[ 1<<i ]=0;
extra[ 1<<i ]=g[i];
}
for (i=1;i< (1<<n);++i) {
for (j=0;j<n;++j)
if (!(i&(1<<j) ) ) {
int nc=i|(1<<j);
int nb,ne;
if (extra[ i ] + g[j] > gmax ) {
nb=best[i]+1;
ne=g[j];
}
else {
ne=extra[i] + g[j];
nb=best[i];
}
if (nb < best[ nc ] || (nb== best[nc] && ne < extra[ nc ]) ) {
best[ nc ]=nb;
extra[ nc ]=ne;
}
}
}
return best[ (1<<n)-1 ] + (extra[ (1<<n)-1 ] > 0);
}
int main() {
FILE *fout=fopen ("zebughil.out","w");
int i;
for (i=1;i<=3;++i) {
read();
fprintf(fout,"%d\n",dinamic());
}
fclose(fout);
return 0;
}