Copy-and-paste the following code, and hit Enter again:
function schedule(c,d,e,f,g){function h(q){for(let r=0,s=c.length;r<s;++r)if(c[r].id===q)return c[r]}function l(q){let r=conflictTeachers=0,[s,t]=[[],[]];for(let w of q){let x=h(w);s.push(...x.students),t.push(x.teacher)}let u={},v={};for(let w=0,x=s.length;w<x;++w)u[s[w]]?++r:u[s[w]]=1;for(let w=0,x=t.length;w<x;++w)v[t[w]]?++conflictTeachers:v[t[w]]=1;return{students:r,teachers:conflictTeachers}}function n(q,r,s,t){if(!q.length)return s;let u=[];if(!s)for(;u.push([])<d;);else u=s.map(x=>[...x]);let v=[];for(let z,x=0,y=u.length;x<y;++x)z=l(u[x].concat(q[0])),v[x]={scheduleNum:x,conflict:z.students+z.teachers*e};v=v.sort((x,y)=>x.conflict-y.conflict||Math.random()-0.5);for(let z,x=0,y=f*v.length;x<y;++x){if(z=!0,0===v[x].conflict){u[v[x].scheduleNum].push(q[0]);break}if(0<r){let A=[...u[v[x].scheduleNum]],B=u.map(C=>[...C]);if(B[v[x].scheduleNum]=[q[0]],B=n(A,r-1,B,!0),B){let C=newTimetableConflicts=0;for(let F,D=0,E=u.length;D<E;++D)F=l(u[D]),C+=F.students+F.teachers*e;for(let F,D=0,E=B.length;D<E;++D)F=l(B[D]),newTimetableConflicts+=F.students+F.teachers*e;if(newTimetableConflicts<=C){u=B;break}else if(t)z=!1;else{u[v[0].scheduleNum].push(q[0]);break}}else if(t)z=!1;else{u[v[0].scheduleNum].push(q[0]);break}}else if(t)z=!1;else{u[v[0].scheduleNum].push(q[0]);break}}return n(q.slice(1),r,u)}let o=[];for(let q of c)for(let r=0,s=q.classCount;r<s;++r)o.push(q.id);let p=o.sort((q,r)=>h(r).students.length-h(q).students.length);return n(p,g)}