#include #include #include #define FOR(i,n) for(int i = 0; i < n; i++) typedef unsigned int uint; typedef struct SPOJAK{ uint val[5]; struct SPOJAK *naslednik; }spojak; bool *****batoh; uint K,N; uint surovin[5]; uint (*recept)[5]; spojak* HEAD; spojak* TAIL; spojak* spojakINIT(){ spojak* vrchol = (spojak*) malloc(sizeof(spojak)); vrchol->naslednik = NULL; for(int i = 0; i < 5; i++) vrchol->val[i] = 0; return vrchol; } int main(void){ scanf(" %u",&K); FOR(i,K){ scanf(" %u",&surovin[i]); } for(int i = K; i < 5; i++) surovin[i] = 0; scanf(" %u",&N); recept = (uint(*)[5]) malloc(sizeof(uint)*5*(N)); FOR(i,N){ FOR(j,K){ scanf(" %u",&recept[i][j]); } } batoh = malloc(sizeof(bool ****) * (surovin[0]+1)); FOR(i,surovin[0]+1){ batoh[i] = malloc(sizeof(bool ***) * (surovin[1]+1)); FOR(j, (surovin[1]+1)){ batoh[i][j] = malloc(sizeof(bool **) * (surovin[2]+1)); FOR(k, (surovin[2]+1)){ batoh[i][j][k] = malloc(sizeof(bool *) * (surovin[3]+1)); FOR(l, (surovin[3]+1)){ batoh[i][j][k][l] = malloc(sizeof(bool ) * (surovin[4]+1)); FOR(m, (surovin[4]+1)) batoh[i][j][k][l][m] = false; } } } } spojak* HEAD = spojakINIT(); TAIL = HEAD; uint val[5]; FOR(i,5) val[i] = 0; int pocet = 1; FOR(i,N){ spojak* v = HEAD; uint new_pocet = 0; FOR(q, pocet && v != NULL){ FOR(j,K){ val[j] = v -> val[j] + recept[i][j]; if(val[j] > surovin[j]) goto dalsi; } if(! batoh[val[0]][val[1]][val[2]][val[3]][val[4]]){ spojak* vrchol = spojakINIT(); FOR(j,5){ vrchol->val[j] = val[j]; } TAIL->naslednik = vrchol; TAIL = vrchol; new_pocet++; batoh[val[0]][val[1]][val[2]][val[3]][val[4]] = true; } dalsi: v = v->naslednik; } pocet +=new_pocet; } uint zbytek = 2000000000; uint celkem_surovin = 0; FOR(i,K) celkem_surovin += surovin[i]; spojak* v = HEAD; printf("\npocitam zbytek\n"); while(v != NULL){ uint tmp_zbytek = celkem_surovin; FOR(i,5) tmp_zbytek -= v -> val[i]; if (zbytek > tmp_zbytek) { zbytek = tmp_zbytek; } v = v->naslednik; } printf("%u\n",zbytek); return 0; }