Clean, 238 bytes
import StdEnv,Data.List
$v m#p=[[(x,y)]\\x<-[0..]&l<-m,y<-[0..]&' '<-l]
=or[and(zipWith(>=)(s++[0,0..])v)\\s<-permutations(map length(foldl(\p _=nub[sort(nub(e++[(x,y)\\(u,v)<-e,x<-[u-1,u,u+1],y<-[v-1,v,v+1]|(m!!x)!!y<'C']))\\e<-p])p p))]
Try it online!
Defines the function $ :: [Int] [[Char]] -> Bool
. TIO link includes a wrapper around STDIN.
Expanded:
$ v m // in function $ of v and m
# p // define p as
= [ // a list of
[(x, y)] // lists of pairs (x, y)
\\ // for each
x <- [0..] // index x
& l <- m // at list l in m
, // for each
y <- [0..] // index y
& ' ' <- l // at spaces in l
]
= or [ // true if any of the list of
and ( // true if all of
zipWith // element-wise application of
(>=) // greater than or equal to
(s ++ [0, 0..]) // permutation s padded with zeroes
v // list v of volumes
)
\\ // for each
s <- permutations ( // permutation s of
map length ( // the lengths of
foldl // a left-fold of
(\p _ // function on p discarding second argument
= nub [ // the unique elements of the list of
sort ( // sorted versions of
nub ( // unique lists composed of
e // list e of points in a region
++ [ // prepended to the list of
(x, y) // pairs (x, y)
\\ // for each
(u, v) <- e // pair (u, v) in list e
, // for each
x <- [u-1, u, u+1] // x-coordinate adjacent to u
, // for each
y <- [v-1, v, v+1] // y-coordinate adjacent to v
| // where
(m!!x)!!y < 'C' // the character in m at (x, y) is a space
]
)
)
\\ // for each
e <- p // region e in p
]
)
p // applied to a starting argument of p
p // recursively, for each element in p
)
)
]