For any program to run you need some specific memory for storing variables or data structures or buffers for reading and writing files. The process of making this memory available is known as memory allocation. (It is not all the memory required to run the program.)
In Static allocation one decides while writing the code how much memory the program needs and puts that "hardwired" in the code.
In Dynamic allocation the programmer does not fix the amount of memory allowed to the program, rather puts the memory allocation in the program logic. As and when memory is required (or the programmer thinks at that step it would be required) it is allocated. The amount allocated depends on the parameters in that state of the program.
Lets take a simple analogy of a school student. You can say static allocation is like writing/working in a copy/notebook, wherein you decide before starting your work how many papers u will need. You take the copy accordingly and commit it all for that specific work. For your work u need to write/erase/rewrite within those pages.
Whereas dynamic allocation is working with loose sheets. You do not commit any number of sheets when u start, but you can add any number of sheets required at any time.
With both kinds of allocation it is necessary to keep track of how much memory is necessary and to free the unnecessary memory.
This whole process of allocation and freeing the unnecessary memory is known as memory management.
In C & C++ you always need to keep track of memory management while languages like Java do this on their own and the programmer need not worry about it.