Public Key Encryption with forward secrecy
One approach can be found in this paper by Canetti, Halevi and Katz.  To summarize the approach:


This generate a tree of private keys; from a node, you can generate private keys downwards (to child nodes), but you cannot compute upwards (to the parent nodes).  This achieves forward secrecy by generating child nodes and erasing parent nodes.
The public key can be used to encrypt to any private key node; if we have the private key for that node (or we can generate it because we have one of its parents), we can decrypt the message; if the private key for that node has already been erased, we cannot.
The size of the public key is constant (that is, independent of the number of time steps supported).
The size of an encrypted message is $O(\log t)$ (where $t$ is the number of time steps supported).
The size of the private key for the entire system is $O(\log t)$; this includes the number of private keys nodes stored in memory at any one time.
Encryption and decryption both take $O(\log t)$ time.
The algorithm uses a bilinear mapping that meets the BDH (Bilinear Diffie-Hellman) assumption.