Pagini recente » Cod sursa (job #1638033) | Cod sursa (job #2744628) | Cod sursa (job #1023438) | Cod sursa (job #2189453) | Cod sursa (job #1670770)
#include<stdio.h>
#define MAXN 20
#define DOIN 270000
FILE *f=fopen("zebughil.in","r"), *g=fopen("zebughil.out","w");
struct Camioane { int ramas, nrcam; } pd[DOIN]; // kg ramas, nrcam = camioane pana acum
int N, G, Z[MAXN], q, doi[MAXN];
void Citire(){
int i;
fscanf(f,"%d %d\n",&N,&G);
for(i=1;i<=N;i++)
fscanf(f,"%d",&Z[i]);
doi[0] = 1;
for(i=1;i<=N+1;i++)
doi[i] = doi[i-1] * 2;
}
Camioane Minim( Camioane A, Camioane B ){
if( B.nrcam == -1 )
return A;
if( A.nrcam < B.nrcam || ( A.nrcam == B.nrcam && A.ramas > B.ramas ) )
return A;
return B;
}
void Rezolvare(){
int i, bit, put, iMAX, NEWramas, NEWnrcam;
Camioane NEW;
iMAX = doi[N] - 1;
pd[0].ramas = G;
pd[0].nrcam = 1;
for(i=1;i<=iMAX;i++){
bit = i;
put = 0;
pd[i].ramas = 0;
pd[i].nrcam = -1;
while( bit > 0 ){
if( bit % 2 == 1 ){
NEW = pd[ i - doi[put] ];
NEW.ramas -= Z[put+1];
if( NEW.ramas < 0 ){
NEW.nrcam ++;
NEW.ramas = G - Z[put+1];
}
pd[i] = Minim( NEW, pd[i] );
}
bit /= 2;
put ++;
}
} fprintf(g,"%d\n", pd[iMAX].nrcam );
}
int main(){
for(q=1;q<=3;q++){
Citire();
Rezolvare();
}
return 0;
}