You can use fixed point numbers instead of floats; not sure how much you gain.
Your code compiles to 843 bytes RAM, I think that you should be able to squeeze a bit more out; how did you determine that you could only have 20 particles?
From your code
void setup() {
Serial.begin(9600);
pinMode(1, INPUT);
Pin 1 is the TX pin; why do you fiddle with it if you want to have the serial communication available for debugging?
If it's for the purpose of the randomSeed(analogRead(1)), it's not needed; and for that, it would be pinMode(A1, INPUT). The analogRead() will work properly with both A1 and 1.