Answer : 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 ...