BASKETBALL FRVR?

JavaScript (ES6), 73 72 bytes

Prints all unique, lexically sorted combinations.

f=(n,p=0,s='')=>n?n>1&&f(n-2,0,s+'S')&f(n-(p-9?p+=3:9),p,s+'V'):alert(s)

Test cases

In this snippet, alert() has been replaced by console.log() for user-friendliness.

f=(n,p=0,s='')=>n?n>1&&f(n-2,0,s+'S')&f(n-(p-9?p+=3:9),p,s+'V'):console.log(s)

;[2, 3, 4, 12, 16]
.forEach(n => { console.log('[' + n + ']'); f(n); })


Jelly, 30 bytes

o2,5ṁo8‘
Hṗ@€⁾VSẎðOḂŒgÇ€FS=ðÐf

A monadic link returning a list of the strings (lists of characters).

Try it online! - The footer calls the link and separates the entries by newlines since a full program's implicit output would smash them together.

How?

o2,5ṁo8‘ - Link 1, helper to form shot scores: list of shots grouped by type (S=1 and V=0)
         -                                e.g. [[1,1],[0,0,0,0,0],[1,1],[0],[1,1]]
 2,5     - 2 paired with 5 = [2,5]
o        - logical or (vectorises)             [[1,1],[2,5,0,0,0],[1,1],[2,5],[1,1]]
    ṁ    - mould like the input                [[1,1],[2,5,0,0,0],[1,1],[2],[1,1]]
     o8  - logical or with 8                   [[1,1],[2,5,8,8,8],[1,1],[2],[1,1]]
       ‘ - increment                           [[2,2],[3,6,9,9,9],[2,2],[3],[2,2]]

Hṗ@€⁾VSẎðOḂŒgÇ€FS=ðÐf - Link: number, total score, n
H                     - halve n
    ⁾VS               - literal ['V','S']
 ṗ@€                  - Cartesian power with swapped @rguments for €ach
                      -   ...i.e. for each in [1,2,...,floor(half n)]
                      -   yielding all strings of Vs and Ss from length 1 to floor(half n)
       Ẏ              - tighten (from a list of lists of lists to a list of lists)
        ð         ðÐf - filter keep those entries for which this yields a truthy value:
         O            -   cast to ordinals (S->83, V->86)
          Ḃ           -   modulo 2         (S->1, V->0)
           Œg         -   group equal runs (e.g. [0,0,1,1,0] -> [[0,0],[1,1],[0]])
             Ç€       -   call the last link (1) as a monad for €ach (transform to scores)
               F      -   flatten (make one list of scores)
                S     -   sum (calculate the total score of the string)
                 =    -   equals right argument (n)?

The resulting order is actually lexicographical in reverse, to have it forward sorted just reverse it by appending .


Python 3, 96 95 85 77 73 bytes

-1 byte thanks to @notjagan
-4 bytes thanks to @xnor

f=lambda x,s='',i=3:f(x-2,s+'S')+f(x-i,s+'V',3*(i<9)+i)if x>0 else[s]*-~x

Try it online!