// Aircraft Maintenance: Shortest Time // Dynamic Programming // By Seksun Suwanmanee, Dept. of Computer Engineering PSU Hatyai // July 2010 #include #include #define MX 100 //maximum number of crews #define MXHRS 300 //max hours per crew // global variables int ncrew,ntask, task[5*MX][2]={}, //Let's suppose there are at most 5*MX tasks crew[MX][3]={}, Table[MXHRS][5*MX][MX]={}; //lookup table for reducing the recursive calls int mxhrs; char inp[3][MX],taskID[5* MX][MX]; int step=0, depth=0, mxDepth=0, maxSoFar=0; // just for stat and tracking int string2int(char s[]) { int i,r=0,len=strlen(s); for(i=0;i=y?x:y) ; } //Dynamic recursive function int ks(int mWHr, int wHr, int ti,int ci); int main() { int i,j, totalCost, minWHrs; //local test //freopen("smallinput.txt","r",stdin); //freopen("inputSample.txt","r",stdin); //freopen("inputTest.txt","r",stdin); //freopen("Dinput.txt","r",stdin); // Reading the input ncrew=0; ntask=0; mxhrs=0; while( scanf("%s %s %s",inp[0],inp[1],inp[2]) == 3 ) { // crew information begins with number if (inp[0][0]>='0' && inp[0][0]<='9') { i=string2int(inp[0]); // crew number crew[i][0]=string2int(inp[1]); // crew skill level crew[i][1]=string2int(inp[2]); // crew cost per hour crew[i][2]=0; // initial working hours = 0 for all crew ncrew++; } else // task information { strcpy(taskID[ntask],inp[0]); //task ID task[ntask][0]=string2int(inp[1]); // task level task[ntask][1]=string2int(inp[2]); // task hours mxhrs+=task[ntask][1]; ntask++; } } //show input data for(i=0;i2000000) {step--;return MXHRS+1; } if (mWHr>MXHRS) { depth--; return MXHRS+1; } if(wHr<=0 || ti<0 ) { depth--; return mWHr; } if (Table[mWHr][ti][ci]!=0) { depth--; return Table[mWHr][ti][ci]; } //crew does not have enough skill if (crew[ci][0] (mWHr) ) { Table[mWHr][ti][ci]=crew[ci][2]; //printf("mWHr=%d new max=%d ti= %d ci=%d \n",mWHr,crew[ci][2],ti,ci); } else Table[mWHr][ti][ci]=mWHr; crew[ci][2]-=task[ti][1]; //remove task hours //printf("mWHr=%d max=%d ti= %d ci=%d \n",mWHr,Table[mWHr][ti][ci],ti,ci); if(maxSoFar(mWHr) ) selectCi=crew[ci][2]; else selectCi=mWHr; doTiSelectCi=ks(selectCi,wHr-task[ti][1],ti-1,ncrew-1); // Not select crew ci for task ti but select ci-1 for task i // and then do task i-1 from ncrew-1 crew[ci][2]-=task[ti][1]; //remove task hours doTiSelectCi_1 = ks(ks(mWHr,wHr,ti,ci-1) ,wHr-task[ti][1] ,ti-1, ncrew-1); Table[mWHr][ti][ci]=getMin(doTiSelectCi,doTiSelectCi_1); if(maxSoFar