"Breadth course" problem – find maximum independent set given all maximal cliques
This is an instance of bipartite matching.   You have one left-vertex for each course, one right-vertex for each category, and an edge between each course and each category it can be used for.  Now you want to find a maximum matching in this bipartite graph.  There exist standard polynomial-time algorithms for finding a maximum matching in a bipartite graph.