initialState(t,m,b,n,I,p){ for h = 1 to m: s_h = 0 for i = 1 to n: for j=1 to ell_i o_{i,j} <- {r_{i,j},...,r_{i,j}+p_{i,j}-1} v<-1 return(s,o,v) chooseObl(t,borSub,b,s,r,p,d,k): U <- emptyset for j=1 to k: obl_j = {r_j,...,r_j+p_j-1} for h=1 to #b A <- {s_h,...,s_h+b_h-1} if(A \cap U /= \empty) return(False, obl) U = U \cup {s_h,...,s_h+b_h-1} while oblOverlap(t,obl,k,s,r,p,U) : for i = 1 to k: fSubsIt(obl_j,{r_j,...,d_j) (s,o,v) <- initialState(t,m,b,n,I,p,ell) (s*,o*,v*) <-initialState(t,m,b,n,I,p,ell) while True: v<-0 for i=1 to n: borSub <- {1,...,m} vS <- 0 while True //for j=1 to ell_i // oblSub <- {r_{i,j},...,r_{i,j}+p_{i,j}-1} (canAttend,obl) = chooseObl(t,borSub,b,s,r_i,d_i,p_i,\ell_i) if(canAttend): vS <- #borSub o*_i <- obl break (end,borSub) <- subsIt(borSub,{1,...,m}) if not subsIt(borSub) break v <- v+vS if(v*