my $sol = 
  allocate_minimal_rooms (4, 5, [[1,0,0,1,0],
                                 [0,1,0,0,1],
                                 [0,0,1,0,1],
                                 [0,0,1,1,0],
                                ]);
use Data::Dumper;
print Dumper($sol);



sub allocate_minimal_rooms {
  my ($n_courses, $n_timeslots, $sched) = @_;   
  my (@alloc, @rooms);
 COURSE:
  for my $c (@$sched) {
    for my $rn (0 .. $#alloc) {
      if (no_conflicts($c, $alloc[$rn])) {
        # found a nonempty room that this course will fit into
        push @rooms, $rn;
        for (0 .. $n_timeslots - 1) {
          $alloc[$rn][$_] += $c->[$_];
        }
        next COURSE;
      }
    }
    # allocate new room
    push @alloc, [@$c];
    push @rooms, $#alloc;
  }
  \@rooms;
}

sub no_conflicts {
  my ($c, $a) = @_;
  for my $n (0 .. $#$c) {
    return if $c->[$n] && $a->[$n];
  }
  return 1;
}
