If you know your maximum available (as you said u do), why not use that value? It'll make your life much easier.
Otherwise you can just set a queue with child queues and different priorities... not so sure this will work so well though... I've never used a queue without setting max-limit and limit-at...
If you use values in max-limit and limit-at, you will achieve exactly what you want, and be able to define 'dynamic' behaviour.
Do not set a rate limit in the 'queue types', so you still set type=pcq
max-limit and limit-at will define how much bandwidth is available to divide amongst your PCQ users, and if you define different classes in different child queues attached to the same parent, the you can set max-limit equal on ALL queues, but limit-at at different rates.
So, to describe in visual terms:
Parent (main): max-limit=10Mb
VIP-queue: parent=main, max-limit=10Mbps, limit-at=3Mbps, priority=1, packet-mark=VIP
Normal-queue: parent=main, max-limit=10Mbps, limit-at=7Mbps, priority=2
This will give 10Mbps to any user who is the only one using the gateway. When user 2 logs on, it will divide by 2, giving 5Mbps.
As more and more users come online, it will divide further and further until the full 10Mbps is being used, then 'limit at' starts kicking in to allocate bandwidth availability between classes.
Any users with packet-mark=VIP will go in the queue VIP-queue.
If for some reason your 10Mbps upstream bandwidth becomes 7Mbps total and the users are drawing more than this, then VIP-queue wil still get 3Mbps total available, but normal-queue wil shrink to 4Mbps due to lower priority...