A sorcerer's spellbook
Java (JDK 10), 191 bytes



L-&gt;S-&gt;{int m[]=new int[9],z=0,Z=0,l=0;for(m[0]++;l++&lt;L;z+=--m[z]&lt;1?1:0)m[Z=~-l/2-l/19]+=l&lt;12?2:l&gt;17?1:1+l%2;l=0;for(int s:S){if(--s&gt;Z)l++;Z-=--m[Z&gt;0?Z:0]&lt;1?1:0;}for(int i:m)l|=i;return l==0;}


Try it online!


Input requirement: the spell list must be ordered from greatest spell levels to the lowest one.


Explanations

L-&gt;S-&gt;{                                        // Curried-lambda with 2 parameters: sorcerer-level and spell list
 int m[]=new int[9],                           // Declare variables: m is the max level  of each spell.
     z=0,                                      // z is the minimum spell level of the maximized spell list.
     Z=0,                                      // Z is the maximum spell level for the current level.
     l=0;                                      // l is first a level counter, then a reused variable
 for(m[0]++;l++&lt;L;z+=--m[z]&lt;1?1:0)             // for each level, compute the maximized known spells.
  m[Z=~-l/2-l/19]+=l&lt;12?2:l&gt;17?1:1+l%2;        // 
                                               // Now m is the row for level L in the table below.
 l=0;                                          // l now becomes an error indicator
 for(int s:S){                                 // This loop checks if the spell-list matches the spells allowed for that level.
  if(--s&gt;Z)l++;                                // Spell-levels are 1-based, my array is 0-based so decrease s.
  Z-=--m[Z&gt;0?Z:0]&lt;1?1:0;                       // Remove a max level if we've expleted all the spells, avoiding exception.
 }                                             //
 for(int i:m)l|=i;                             // Make sure there are no more values in m.
 return l==0;                                  // Return true if no miscount were encountered.
}


Table 1: Maximized spell distribution for each sorcerer-level, used from Axoren's answer on the linked question.



Credits


Saved 14 bytes thanks to Kevin Cruijssen.